背景:
最近刚好有需求对interface的变量类型进行类型判断,然后断言获取指定的变量类型值,那么首先就是要获取变量的类型,所以通过相关知识了解到,go语言获取interface的类型有两种方式:
反射,类型断言。所以下面就针对这两种方式进行分析相关性能:
1. 反射:
// 测试的变量类型
type U struct {
name string
age int
}
func Benchmark1(t *testing.B) {
var u interface{}
u = U{
name: "Hello",
age: 10,
}
for i := 0; i < t.N; i++ {
a := reflect.TypeOf(u)
switch a.Name() {
case "U":
fmt.Println("成功", u.(U))
}
}
}
压测:性能值
成功 {Hello 10}
成功 {Hello 10}
Benchmark1-16 36970 28705 ns/op
PASS
2. 类型断言:
// 测试的变量类型
type U struct {
name string
age int
}
func Benchmark2(t *testing.B) {
var u interface{}
u = U{
name: "Hello",
age: 10,
}
for i := 0; i < t.N; i++ {
switch u.(type) {
case U:
fmt.Println("成功匹配", u.(U))
}
}
}
压测:性能值
成功匹配 {Hello 10}
成功匹配 {Hello 10}
Benchmark2-16 33265 36270 ns/op
结论:
通过以上的压测分析,建议使用反射进行类型的判断,性能会更高一些。