如果我的结构中的给定字段未通过验证,那么验证程序包会给我返回这样的字符串:
myString := "Stream.Fields[0].Name"
Run Code Online (Sandbox Code Playgroud)
我如何使用此字符串来访问其中指定的结构字段?我需要以某种方式引用它,但我不知道从哪里开始。
我开始学习Go,并且已经遇到了“ 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
}
Run Code Online (Sandbox Code Playgroud)
这是golang播放链接:https : //play.golang.org/p/NIRdGONZBhP