golang:如何判断一个interface{}类型的数据具体是什么类型?
■实例说明如何判断一个interface{}类型的数据,具体是什么类型呢?判断类型的方式也有多种,那优缺点又是什么呢?
总结:
1)如果类型优先,并且强度速度,则我们使用GetDataType1
2)如果类型种类不确定,且对速度不敏感,则使用GetDataType2
■实例代码
package main
import (
"fmt"
"reflect"
"time"
)
// 测试结构对象
type MyStruct struct {
Value string
}
// GetDataType1 获取data数据类型
// 缺点:这种方法只能试用于我们想确认的有限类型,即我们知道这个数据只能是几个固定类型中的一个,可以使用这种方式
// 优点:速度比反射reflect.TypeOf机制要快,快一个数量级
func GetDataType1(data interface{}) string {
// .(type)只能在switch语句中使用
switch data.(type) {
case string:
return "string"
case int:
return "int"
case int32:
return "int32"
case int64:
return "int64"
case MyStruct: // 这里是一个自定义结构
return "MyStruct"
default:
return "unknown"
}
}
// GetDataType2 通过反射机制获取data数据类型
// 优点:这种方式比较通用
// 缺点:速度比switch x.(type)方式要慢
func GetDataType2(data interface{}) string {
return reflect.TypeOf(data).String()
}
func main() {
value := "我是一个字符串"
t1 := GetDataType1(value)
fmt.Println(t1)
// 输出:string
t2 := GetDataType2(value)
fmt.Println(t2)
// 输出:string
sValue := MyStruct{"china"}
t3 := GetDataType1(sValue)
fmt.Println(t3)
// 输出:MyStruct
t4 := GetDataType2(sValue)
fmt.Println(t4)
// 输出:main.MyStruct
///////////////////////////////////////////////////////
// 性能对比,运行多次,输出差不多,均是反射慢一个数量级左右
curTime := time.Now()
for i := 0; i <= 10000; i++ {
t3 = GetDataType1(sValue)
}
fmt.Println(time.Since(curTime))
// 输出:30.363µs
curTime = time.Now()
for i := 0; i <= 10000; i++ {
t3 = GetDataType2(sValue)
}
fmt.Println(time.Since(curTime))
// 输出:562.862µs
}
页:
[1]