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

时间:2017-01-03 12:56:28

标签: go

如果我的struct中的给定字段没有通过验证,验证程序包会返回这样的字符串:

myString := "Stream.Fields[0].Name"

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

我开始学习Go并且已经遇到过"反映"似乎能够做到这一点的包裹,但我不知道该寻找什么或如何制定正确的问题。

2 个答案:

答案 0 :(得分:4)

您需要使用reflect包。 在这里,我编写了一个示例函数,它给出了一个实例和类似Stream.Details.Name的字符串键将返回Name字段实例Stream的详细信息

这适用于没有arraymap运算符的结构,只适用于.运算符。您可以将其扩展为支持[]以及

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
}

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

答案 1 :(得分:0)

此库也存在,它可能会执行您想要的操作: https://github.com/mcuadros/go-lookup

lib在引擎盖下使用reflect package