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

时间:2016-01-31 16:03:07

标签: reflection go

我有一个.ini配置文件,我想用它来初始化Configuration结构。

我想使用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
}

任何帮助表示赞赏...

2 个答案:

答案 0 :(得分:2)

使用typeget a StructField。 StructField具有name

 name := value.Type().Field(i).Name

请注意,ini包的File.MapToSection.MapTo方法实现了此功能。

答案 1 :(得分:1)

虽然@MuffinTop解决了你的问题,但我会说你可能正在解决一个错误的问题。我个人至少知道两个包github.com/Thomasdezeeuw/inigopkg.in/gcfg.v1,它们能够解析INI风格的文件(各种级别的“INI-ness”,FWIW)并自动填充你的{{ 1}} - 使用反射键入的值,所以对你来说它只是在你的结构的字段上正确设置标签(如果需要的话)。

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