通过包含完整路径的给定字符串访问struct字段

Gre*_*reg 0 go

如果我的结构中的给定字段未通过验证,那么验证程序包会给我返回这样的字符串:

myString := "Stream.Fields[0].Name"
Run Code Online (Sandbox Code Playgroud)

我如何使用此字符串来访问其中指定的结构字段?我需要以某种方式引用它,但我不知道从哪里开始。

我开始学习Go,并且已经遇到了“ Reflect”包,该包似乎能够做到这一点,但我不知道要寻找什么或如何提出正确的问题。

Sar*_*lai 5

您需要为此使用反射包。在这里,我编写了一个示例函数,该函数给出了一个实例和字符串键,例如Stream.Details.Name将从Name实例详细信息字段返回。Stream

这适用于没有array或map运算符的结构,仅适用于.运算符。您可以延长该支持[]藏汉

func getValueFromStruct(keyWithDots string, object interface{}) (interface{}, error) {
    keySlice := strings.Split(keyWithDots, ".")
    v := reflect.ValueOf(object)
    // iterate through field names ,ignore the first name as it might be the current instance name
    // you can make it recursive also if want to support types like slice,map etc along with struct
    for _, key := range keySlice[1:] {
        for v.Kind() == reflect.Ptr {
            v = v.Elem()
        }
        // we only accept structs
        if v.Kind() != reflect.Struct {
            return nil, fmt.Errorf("only accepts structs; got %T", v)
        }

        v = v.FieldByName(key)
    }
    return v, nil
}
Run Code Online (Sandbox Code Playgroud)

这是golang播放链接:https : //play.golang.org/p/NIRdGONZBhP