如果我有一个结构,我想得到它的关键,但它目前的类型interface{}
我该怎么做?
目前我收到以下编译错误:
invalid operation: d[label] (index of type interface {})
播放:http://play.golang.org/p/PLr91d55GX
package main
import "fmt"
import "reflect"
type Test struct {
s string
}
func main() {
test := Test{s: "blah"}
fmt.Println(getProp(test, "s"))
}
func getProp(d interface{}, label string) (interface{}, bool) {
switch reflect.TypeOf(d).Kind() {
case reflect.Struct:
_, ok := reflect.TypeOf(d).FieldByName(label)
if ok {
// errors here because interface{} doesn't have index of type
return d[label], true
} else {
return nil, false
}
}
}
我是否真的必须对每种不同的类型执行大量的case语句并调用反映的reflect.ValueOf(x).String()
等?我希望有更优雅的方式。
答案 0 :(得分:2)
你可以这样做,但我认为只有你的结构成员s
是一个导出的字段(例如在你的例子中使用大写S
)才会有效。
func getProp(d interface{}, label string) (interface{}, bool) {
switch reflect.TypeOf(d).Kind() {
case reflect.Struct:
v := reflect.ValueOf(d).FieldByName(label)
return v.Interface(), true
}
return nil, false
}
(+更多错误处理)
答案 1 :(得分:0)
我不确定您正在寻找什么,但有一种稍微简单的方法来查找接口{}类型。在您的情况下,您可以使用:
switch val := d.(type) {
case Test:
fmt.Println(d.s)
}
显然,我没有做与你相同的事情,但我的想法是你可以用" d。(类型)"来检查类型,一次"案例测试:"确定它是Test类型的结构,您可以这样访问它。
不幸的是,这并没有解决标签对结构中值的访问,但它至少是一种更优雅的方式来确定类型,@ nos显示如何使用
v := reflect.ValueOf(d).FieldByName(label)
return v.Interface(), true