2017-01-03 11 views
0

一个验证包让我背串这样如果我的结构某一领域没有通过验证:由包含完整路径给定的字符串访问在Golang结构领域

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

哪有我使用这个字符串来访问它中指定的struct字段?我需要以某种方式参考它,但我不知道从哪里开始。

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

+1

可能会作出这样的字符串[文/模板]兼容(https://golang.org/pkg/text /模板/)和解析使用? – YOU

+1

你需要使用'反射'包 –

回答

3

您需要为此使用reflect包。 在这里,我已经写这给像Stream.Details.Name一个实例和字符串键会从实例Stream

这适用于结构领域详情返回Namearraymap运营商,只是.运营商的样本函数。您可以延长该支持[]藏汉

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 
    for _, key := range keySlice[1:] { 
     if 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/2qxTZgN1_K

+0

谢谢你的一个很好的例子,我会试图找出它! – Greg

相关问题