Reflection 如何使用反射初始化结构值字段?

Reflection 如何使用反射初始化结构值字段?,reflection,go,Reflection,Go,我得到了一个.ini配置文件,我想用它来初始化配置结构 我想使用Configuration字段名并循环它们,用.ini文件中的相应值填充我的新实例 我认为实现这一点的最好方法可能是反射API(也许我完全错了,告诉我…) 我这里的问题是,我不知道如何访问字段的名称(如果可能的话) 这是我的密码: package test import( "reflect" "gopkg.in/ini.v1" ) type Config struct { certPath strin

我得到了一个
.ini
配置文件,我想用它来初始化
配置
结构

我想使用
Configuration
字段名并循环它们,用.ini文件中的相应值填充我的新实例

我认为实现这一点的最好方法可能是反射API(也许我完全错了,告诉我…)

我这里的问题是,我不知道如何访问字段的名称(如果可能的话)

这是我的密码:

package test
import(
     "reflect"
     "gopkg.in/ini.v1"
 )

type Config struct {
    certPath string
    keyPath  string
    caPath   string
}

func InitConfig(iniConf *ini.File) *Config{
    config:=new(Config)
    var valuePtr reflect.Value = reflect.ValueOf(config)
    var value reflect.Value = valuePtr.Elem()
    for i := 0; i < value.NumField(); i++ {
        field := value.Field(i)
        if field.Type() == reflect.TypeOf("") {
            //here is my problem, I can't get the field name, this method does not exist... :'(
            value:=cfg.GetSection("section").GetKey(field.GetName())
            field.SetString(value)
        }
    }
    return config
}
包测试
进口(
“反映”
“gopkg.in/ini.v1”
)
类型配置结构{
证书路径字符串
键路径字符串
卡帕斯串
}
func InitConfig(iniConf*ini.File)*Config{
配置:=新建(配置)
var valuePtr reflect.Value=reflect.ValueOf(配置)
var value reflect.value=valuePtr.Elem()
对于i:=0;i
感谢您的帮助…

使用to。StructField具有以下功能:

请注意,ini包和方法实现了此功能。

使用to。StructField具有:


请注意,ini软件包和方法实现了这一功能。

虽然@MuffinTop解决了您眼前的问题,但我认为您可能解决了一个错误的问题。我个人知道至少有两个软件包和能够解析ini样式的文件(不同级别的“ini性”,FWIW)并使用反射自动填充
struct
类型的值,因此对您来说,这仅仅相当于在结构的字段上正确设置标记(如果需要的话)


我在生产中使用了这两个软件包,因此我可以立即推荐它们。您可能会发现更多专用于分析INI文件的软件包。

虽然@MuffinTop解决了您当前的问题,但我认为您可能解决了一个错误的问题。我个人知道至少有两个软件包和能够分析INI样式的文件(不同级别的“INI ness”,FWIW)并使用反射自动填充您的
结构
类型的值,因此对您来说,这仅仅相当于在结构的字段上正确设置标记(如果需要的话)


我在生产中使用了这两个软件包,因此我可以立即推荐它们。您可能会发现更多专用于解析INI文件的软件包。

hmmm…我想我明白了,谢谢。最后一个问题,是否有其他方法可以在没有反射api的情况下实现这一点?您可以使用INI软件包的MapTo功能(请参阅和上的方法),但它使用的是引擎盖下的反射。哦……事实上,我没有看到那种方法。谢谢你的提示。嗯……我想我明白了,谢谢你。最后一个问题,没有反射api有没有其他方法来实现这一点?你可以使用ini包的MapTo功能(请参阅和上的方法),但它使用的是隐藏的反射。哦……事实上,我没有看到这种方法。谢谢你的提示。实际上@MuffinTop在评论中指出了这一点。我非常确定它存在这样的实现,但作为一个真正的新手,我更好奇底层的裸机方式,因为这是一个将值分配给动态对象/结构的常见过程属性。无论如何,我同意你的看法,使用库的内置映射功能更干净。感谢你花时间回答。@n00dl3,哦,愚蠢的我:我太专注于你对反射的直接使用了,我没有发现你已经在使用
gopkg.in/ini.v1
解析你的ini数据!是的,@MuffinTop的答案加上eir评论是一个点睛之笔。JFTR:the
gopkg.in/ini.v1
包不是我推荐的那些包,因为在我个人看来,该包是典型的过度管理的一个典型例子,其内置的用于序列化R/W访问的锁定是一个明确的反模式。这是一个好的开始,不过现在不要为此烦恼,@n00dl3、只要有效;-)事实上@MuffinTop在评论中指出了这一点。我很确定它存在这样的实现,但作为一个真正的新手,我更好奇底层的裸机方式,因为这是一个将值分配给动态对象/结构属性的常见过程。无论如何,我同意你的观点,使用库的内置映射功能会更干净nality.谢谢你花时间回答。@n00dl3,哦,愚蠢的我:我太专注于你对反射的直接使用了,我没有发现你已经在使用
gopkg.in/ini.v1
来解析你的ini数据了!所以是的,@mufintop的回答加上他们的评论是一个点睛之笔。JFTR:
gopkg.in/ini.v1
软件包不在我推荐的范围之内结束是因为在我个人看来,包是典型的过度管理的一个主要例子,其内置的序列化R/W访问锁定是一个明确的反模式。虽然开始还可以,但现在不必为此烦恼,@n00dl3,只要它能工作;-)
 name := value.Type().Field(i).Name