如果我的struct中的给定字段没有通过验证,验证程序包会返回这样的字符串:
myString := "Stream.Fields[0].Name"
如何使用此字符串来访问其中指定的struct字段?我需要以某种方式引用它,但我不知道从哪里开始。
我开始学习Go并且已经遇到过"反映"似乎能够做到这一点的包裹,但我不知道该寻找什么或如何制定正确的问题。
答案 0 :(得分:4)
您需要使用reflect包。
在这里,我编写了一个示例函数,它给出了一个实例和类似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
}
这是golang播放链接:https://play.golang.org/p/NIRdGONZBhP
答案 1 :(得分:0)
此库也存在,它可能会执行您想要的操作: https://github.com/mcuadros/go-lookup
lib在引擎盖下使用reflect package。