如何在Golang中find一个对象的types?
如何在Golang中find对象的types? 在Python中,我只是使用typeof来获取对象的types。 同样在Go中,有没有一种方法来实现?
这是我从中迭代的容器
for e := dlist.Front(); e != nil; e = e.Next() { lines := e.Value fmt.Printf(reflect.TypeOf(lines)) }
在这种情况下,我无法获取对象行的types,这是一个string数组。
Goreflection包有检查variablestypes的方法。
以下片段将打印出string的reflectiontypes,整数和浮点数。
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
我发现有3种方法可以在运行时识别types:
使用string格式
func typeof(v interface{}) string { return fmt.Sprintf("%T", v) }
使用reflection包
func typeof(v interface{}) string { return reflect.TypeOf(v).String() }
使用types断言
func typeof(v interface{}) string { switch t := v.(type) { case int: return "int" case float64: return "float64" //... etc default: _ = t return "unknown" } }
每种方法都有不同的最佳用例:
-
string格式化 – 占用空间小(不需要导入reflection包)
-
反映包 – 当需要更多关于types的细节时,我们可以使用全面的reflectionfunction
-
types断言 – 允许分组types,例如,将所有int32,int64,uint32,uint64types识别为“int”
使用reflection包:
包反映了实现运行时reflection,允许程序操纵任意types的对象。 典型的用法是用静态types接口{}取值并通过调用TypeOf来提取它的dynamictypes信息,TypeOf返回一个Type。
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)) }
生产:
布尔
串
INT
float64
[]串
操场
使用ValueOf(i interface{}).Kind()
示例ValueOf(i interface{}).Kind()
:
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 }
生产:
布尔
串
INT
float64
串
操场
获取string表示forms:
%T值的types的Go语法表示
package main import "fmt" func main(){ types := []interface{} {"a",6,6.0,true} for _,v := range types{ fmt.Printf("%T\n",v) } }
输出:
string int float64 bool
我会远离反思。 包。 而是使用%T
package main import ( "fmt" ) func main() { b := true s := "" n := 1 f := 1.0 a := []string{"foo", "bar", "baz"} fmt.Printf("%T\n", b) fmt.Printf("%T\n", s) fmt.Printf("%T\n", n) fmt.Printf("%T\n", f) fmt.Printf("%T\n", a) }
最好的方法是在Google中使用reflection概念。
reflect.TypeOf
与包名称一起给出types
reflect.TypeOf().Kind()
给出了下划线的types
你可以使用reflect.TypeOf
。
- 基本types(例如:
int
,string
):它将返回它的名字(例如:int
,string
) - struct:它会以
<package name>.<struct name>
格式返回(例如:main.test
)