从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进行比较,何时使用后者而不是前者?
答案 0 :(得分:0)
回答关于类型开关中的开销的问题:
我使用开关来区分我在脚本语言中的值结构中的底层类型。最初,我存储了一个整数类型常量并打开它。后来我很好奇,并使用类型开关测试。两个版本都具有相同的性能。
这是有道理的,因为AFAIK,接口中的类型存储为一个简单的整数常量(可能是指向具有更多信息的内部数据结构的指针,但这与简单类型检查无关)。
换句话说,不用担心,它与开启任何整数一样快。
我无法保证反射的性能,但我愿意打赌使用反射来制作类型开关要比使用类型开关慢得多。