Go接口如何支持类型信息?

时间:2017-09-21 20:32:25

标签: go

https://research.swtch.com/interfaces:“为了检查接口值是否包含特定类型,如上面的类型开关,Go编译器生成等同于C表达式s.tab->类型的代码以获取键入指针并按照所需类型进行检查。“

什么是类型指针以及在此示例https://play.golang.org/p/2HIOtPOB1w中切换类型的开销是多少?

type St struct {
    x int
}

func main() {
    var i interface{}
    i = 12

    switch i.(type) {
    case int:
        fmt.Println("int")
    case St:
        fmt.Println("St")
    }
}

类型切换(或类型断言)在性能方面如何与ValueOf进行比较,何时使用后者而不是前者?

1 个答案:

答案 0 :(得分:0)

回答关于类型开关中的开销的问题:

我使用开关来区分我在脚本语言中的值结构中的底层类型。最初,我存储了一个整数类型常量并打开它。后来我很好奇,并使用类型开关测试。两个版本都具有相同的性能。

这是有道理的,因为AFAIK,接口中的类型存储为一个简单的整数常量(可能是指向具有更多信息的内部数据结构的指针,但这与简单类型检查无关)。

换句话说,不用担心,它与开启任何整数一样快。

我无法保证反射的性能,但我愿意打赌使用反射来制作类型开关要比使用类型开关慢得多。