goLang的interface{}功能强大,能够指向各种类型数据,在数据类型转换之间能够有以下几种办法
有如下定义
type BaseService struct { IService serviceName string routineNum int}type MyEnum intconst ( CAT MyEnum = iota DOG)var unknowValue interface{}unknowValue = baseService
办法1:应用断言的形式
如下的形式
originalValue, ok := unknowValue.(OriginalType)
val, ok := unknowValue.(BaseService)if ok { fmt.Println(val)}
这种形式简略,没什么可说的,间接转换成你想要的类型
办法2:应用反射
能够应用反射的 reflect.TypeOf(unknowValue)也能够是用reflect.ValueOf(unknowValue)
typeOfUnknown := reflect.TypeOf(unknowValue)fmt.Printf("%v, %v\n", typeOfUnknown.Name(), typeOfUnknown.Kind())unknowValue = "123"typeOfUnknown = reflect.TypeOf(unknowValue)fmt.Printf("%v, %v\n", typeOfUnknown.Name(), typeOfUnknown.Kind())unknowValue = 123typeOfUnknown = reflect.TypeOf(unknowValue)fmt.Printf("%v, %v\n", typeOfUnknown.Name(), typeOfUnknown.Kind())
输入后果为
BaseService, structMyEnum, intstring, stringint, int
func showKind(typeOfUnknown interface{}) { vv := reflect.ValueOf(typeOfUnknown) switch vv.Kind() { case reflect.String: fmt.Println("string") case reflect.Int: fmt.Println("int") fmt.Println(vv.Type().Name()) case reflect.Struct: fmt.Println("Struct") fmt.Println(vv.Type().Name()) }}
后果高深莫测
对于struct类型,Kind是struct,Name是理论的构造体名
对于自定义类型,Kind是理论的类型,Name是自定义的名称
对于根底数据类型,Kind就是理论的类型。
goLang的所有Kind如下
type Kind uintconst ( Invalid Kind = iota // 非法类型 Bool // 布尔型 Int // 有符号整型 Int8 // 有符号8位整型 Int16 // 有符号16位整型 Int32 // 有符号32位整型 Int64 // 有符号64位整型 Uint // 无符号整型 Uint8 // 无符号8位整型 Uint16 // 无符号16位整型 Uint32 // 无符号32位整型 Uint64 // 无符号64位整型 Uintptr // 指针 Float32 // 单精度浮点数 Float64 // 双精度浮点数 Complex64 // 64位复数类型 Complex128 // 128位复数类型 Array // 数组 Chan // 通道 Func // 函数 Interface // 接口 Map // 映射 Ptr // 指针 Slice // 切片 String // 字符串 Struct // 构造体 UnsafePointer // 底层指针)
**办法3:应用.(type)
func showType(typeOfUnknown interface{}) { switch t := typeOfUnknown.(type) { case string: fmt.Printf("string: %v\n", t) case int: fmt.Printf("int: %v\n", t) case BaseService: fmt.Printf(" %v\n", t) case MyEnum: fmt.Printf("MyEnum:%v\n", t) }}
unknowValue = baseServiceshowType(unknowValue)unknowValue = CATshowType(unknowValue)unknowValue = "123"showType(unknowValue)
输入后果
{<nil> BaseService 5}MyEnum:0string: 123