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

Go 通过包含完整路径的给定字符串访问struct字段,go,Go,如果结构中的给定字段未通过验证,验证程序包将返回如下字符串: myString := "Stream.Fields[0].Name" 如何使用此字符串访问其中指定的struct字段?我需要以某种方式引用它,但我不知道从哪里开始 我开始学习围棋,并且已经遇到了“Reflect”软件包,它似乎能够做到这一点,但我不知道要寻找什么或如何制定正确的问题。您需要使用该软件包。 这里我编写了一个示例函数,它给出了一个实例和字符串键,比如Stream.Details.Name将从instanceStream

如果结构中的给定字段未通过验证,验证程序包将返回如下字符串:

myString := "Stream.Fields[0].Name"
如何使用此字符串访问其中指定的struct字段?我需要以某种方式引用它,但我不知道从哪里开始

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

您需要使用该软件包。 这里我编写了一个示例函数,它给出了一个实例和字符串键,比如
Stream.Details.Name
将从instance
Stream
的字段Details返回
Name

这适用于没有
数组
映射
运算符的结构,只有
运算符。您也可以扩展它以支持
[]

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 play链接:

您需要使用此软件包。 这里我编写了一个示例函数,它给出了一个实例和字符串键,比如
Stream.Details.Name
将从instance
Stream
的字段Details返回
Name

这适用于没有
数组
映射
运算符的结构,只有
运算符。您也可以扩展它以支持
[]

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 play链接:

此库也存在,它可能会执行您想要的操作:


库使用引擎盖下的。

此库也存在,它可以执行您想要的操作:


lib使用引擎盖下的。

可以使该字符串与之兼容并使用它进行解析?您需要使用
反射
包可以使该字符串与之兼容并使用它进行解析?您需要使用
反射
包谢谢您提供了一个很好的示例,我将尝试解决它!谢谢你给我举了一个很好的例子,我会努力想办法的!