How to find a type of an object in Go?
如何在Go中找到对象的类型?在Python中,我只是使用
下面是我要迭代的容器:
1 2 3 4 | for e := dlist.Front(); e != nil; e = e.Next() { lines := e.Value fmt.Printf(reflect.TypeOf(lines)) } |
在本例中,我无法获取对象行的类型,这是一个字符串数组。
我找到了3种在运行时返回变量类型的方法:
使用字符串格式
1 2 3 | func typeof(v interface{}) string { return fmt.Sprintf("%T", v) } |
使用反射包
1 2 3 | func typeof(v interface{}) string { return reflect.TypeOf(v).String() } |
。
使用类型断言
1 2 3 4 5 6 7 8 9 10 11 | func typeof(v interface{}) string { switch v.(type) { case int: return"int" case float64: return"float64" //... etc default: return"unknown" } } |
每个方法都有不同的最佳用例:
字符串格式-占用空间短且低(不需要导入反射包)
反射包-当需要关于类型的更多详细信息时,我们可以访问完整反射功能
类型断言-允许分组类型,例如,将所有int32、int64、uint32、uint64类型识别为"int"
- 基本类型(如:
int 、string :返回名称(如:int 、string ) - 结构:它将返回格式为
的内容(例如:. main.test )
小精灵
Go反射包具有检查变量类型的方法。
下面的代码段将打印出字符串、整数和浮点的反射类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main import ( "fmt" "reflect" ) func main() { tst :="string" tst2 := 10 tst3 := 1.2 fmt.Println(reflect.TypeOf(tst)) fmt.Println(reflect.TypeOf(tst2)) fmt.Println(reflect.TypeOf(tst3)) } |
请参见:http://play.golang.org/p/xqmcuvsoja查看它的实际情况。
更多文档请访问:http://golang.org/pkg/reflect/type
使用反射包:
Package reflect implements run-time reflection, allowing a program to
manipulate objects with arbitrary types. The typical use is to take a
value with static type interface{} and extract its dynamic type
information by calling TypeOf, which returns a Type.
号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" "reflect" ) func main() { b := true s :="" n := 1 f := 1.0 a := []string{"foo","bar","baz"} fmt.Println(reflect.TypeOf(b)) fmt.Println(reflect.TypeOf(s)) fmt.Println(reflect.TypeOf(n)) fmt.Println(reflect.TypeOf(f)) fmt.Println(reflect.TypeOf(a)) } |
生产:
1 2 3 4 5 | bool string int float64 []string |
号
游乐场
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" "reflect" ) func main() { b := true s :="" n := 1 f := 1.0 a := []string{"foo","bar","baz"} fmt.Println(reflect.ValueOf(b).Kind()) fmt.Println(reflect.ValueOf(s).Kind()) fmt.Println(reflect.ValueOf(n).Kind()) fmt.Println(reflect.ValueOf(f).Kind()) fmt.Println(reflect.ValueOf(a).Index(0).Kind()) // For slices and strings } |
生产:
1 2 3 4 5 | bool string int float64 string |
。
游乐场
要获取字符串表示形式:
来自http://golang.org/pkg/fmt/
%T a Go-syntax representation of the type of the value
号
1 2 3 4 5 6 7 8 9 | package main import"fmt" func main(){ types := []interface{} {"a",6,6.0,true} for _,v := range types{ fmt.Printf("%T ",v) } } |
。
输出:
1 2 3 4 | string int float64 bool |
。
我会远离反射。包裹。改为使用%t
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package main import ( "fmt" ) func main() { b := true s :="" n := 1 f := 1.0 a := []string{"foo","bar","baz"} fmt.Printf("%T ", b) fmt.Printf("%T ", s) fmt.Printf("%T ", n) fmt.Printf("%T ", f) fmt.Printf("%T ", a) } |
。
最好的方法是在谷歌中使用反射概念。
简而言之,请在FMT包中使用
您可以在运行时使用"reflect"包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "fmt" "reflect" ) func main() { value1 :="Have a Good Day" value2 := 50 value3 := 50.78 fmt.Println(reflect.TypeOf(value1 )) fmt.Println(reflect.TypeOf(value2)) fmt.Println(reflect.TypeOf(value3)) fmt.Printf("%T",value1) fmt.Printf("%T",value2) fmt.Printf("%T",value3) } |
号
to get the type of fields in struct
号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package main import ( "fmt" "reflect" ) type testObject struct { Name string Age int Height float64 } func main() { tstObj := testObject{Name:"yog prakash", Age: 24, Height: 5.6} val := reflect.ValueOf(&tstObj).Elem() typeOfTstObj := val.Type() for i := 0; i < val.NumField(); i++ { fieldType := val.Field(i) fmt.Printf("object field %d key=%s value=%v type=%s ", i, typeOfTstObj.Field(i).Name, fieldType.Interface(), fieldType.Type()) } } |
号
Output
号
1 2 3 | object field 0 key=Name value=yog prakash type=string object field 1 key=Age value=24 type=int object field 2 key=Height value=5.6 type=float64 |
号
See in IDE https://play.golang.org/p/bwIpYnBQiE
号
您可以使用
小精灵
您只需使用fmt包fmt.printf()方法,更多信息:https://golang.org/pkg/fmt/
例子:https://play.golang.org/p/ajg5moxjbjd
反射包来救援:
1 | reflect.TypeOf(obj).String() |
号
检查这个演示