2013-06-23 90 views
8

如何投射reflect.Value到它的类型?如何投射reflect.Value到它的类型?

type Cat struct { 
    Age int 
} 

cat := reflect.ValueOf(obj) 
fmt.Println(cat.Type()) // Cat 

fmt.Println(Cat(cat).Age) // doesn't compile 
fmt.Println((cat.(Cat)).Age) // same 

谢谢!

回答

10

好的,我发现它

reflect.Value具有如下功能Interface()它转换为interface{}

+15

这将其转换到接口{}。我们如何将其转换为实际类型? – Matt

+0

Go,@Matt不可能。没有不安全或手动类型转换(至少在Go 1中),您不能重新创建泛型。 –

+0

https://github.com/bpgriner/golang-reflection-custom-type – bpgriner

21
concreteCat,_ := reflect.ValueOf(cat).Interface().(Cat) 

看到http://golang.org/doc/articles/laws_of_reflection.html 狐例如

type MyInt int 
var x MyInt = 7 
v := reflect.ValueOf(x) 
y := v.Interface().(float64) // y will have type float64. 
fmt.Println(y) 
+9

这就是如果你真的有这种类型的知识。如果你想申请一种盲类断言,我实际上不确定它是可能的。 – Taye

+0

一个解决方案似乎是将'reflect.Value'保持原样并简单地将所有计算移动到使用反射包,而无需转换回常规结构。你可以在[gongular]中看到这个(https://github.com/mustafaakin/gongular/blob/master/handler.go#L101)。相关:https://play.golang.org/p/Ok_q3lx490h – Xeoncross