为了账号安全,请及时绑定邮箱和手机立即绑定

如何在未知接口上获得结构值{}

如何在未知接口上获得结构值{}

Go
慕神8447489 2021-05-14 18:19:23
如果我有一个结构体并且想要获取它的密钥,但是当前它是类型的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


查看完整回答
反对 回复 2021-05-24
  • 2 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信