猿问

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

如果我有一个结构体并且想要获取它的密钥,但是当前它是类型的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

        }

    }

}

我真的必须对每种不同的类型进行大量的案例陈述,然后调用反射的reflect.ValueOf(x).String()等吗?我希望有一种更优雅的方式。


慕神8447489
浏览 205回答 2
2回答

慕沐林林

我不确定您要查找的内容是什么,但是可以使用一种稍微更简单的方法来查找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
随时随地看视频慕课网APP

相关分类

Go
我要回答