如果我有一个结构体并且想要获取它的密钥,但是当前它是类型的interface{},我该怎么做?目前,我收到以下编译错误:invalid operation: d[label] (index of type interface {})播放:http://play.golang.org/p/PLr91d55GXpackage mainimport "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 } }}我真的必须对每种不同的类型进行大量的案例陈述,然后调用反射的reflect.ValueOf(x).String()等吗?我希望有一种更优雅的方式。
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
我不确定您要查找的内容是什么,但是可以使用一种稍微更简单的方法来查找interface {}类型。在您的情况下,您可以使用:
switch val := d.(type) {
case Test:
fmt.Println(d.s)
}
显然,我没有做过与您相同的事情,但是想法是您可以使用“ d。(type)”检查类型,并且一旦“ case Test:”确定它是您的Test类型的结构,您可以这样访问它。
不幸的是,这不能解决标签对结构内部值的访问,但至少是一种确定类型的更优雅的方法,@ nos显示了如何使用
v := reflect.ValueOf(d).FieldByName(label)
return v.Interface(), true
- 2 回答
- 0 关注
- 204 浏览
添加回答
举报
0/150
提交
取消