猿问

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

我有一个.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

}

任何帮助表示赞赏...


慕娘9325324
浏览 191回答 2
2回答

温温酱

使用类型,以获得StructField。StructField 的名称为:&nbsp;name&nbsp;:=&nbsp;value.Type().Field(i).Name请注意,ini 包的File.MapTo和Section.MapTo方法实现了此功能。

翻翻过去那场雪

虽然@MuffinTop 解决了您的紧迫问题,但我想说您可能正在解决一个错误的问题。我个人知道至少有两个包github.com/Thomasdezeeuw/ini和gopkg.in/gcfg.v1,它们能够解析 INI 风格的文件(不同级别的“INI-ness”,FWIW)并struct使用反射自动填充您的-typed 值,所以对您来说它只是数量在结构的字段上正确设置标签(如果需要的话)。我在生产中使用了这两个软件包,因此能够立即推荐它们。您可能会发现,致力于解析INI文件更多的包上godoc.org。
随时随地看视频慕课网APP

相关分类

Go
我要回答