为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕娘9325324 2021-12-07 17:05:09
我有一个.ini配置文件,我想用它来初始化一个Configuration结构。我想使用Configuration字段名称并遍历它们以使用 .ini 文件中的相应值填充我的新实例。我认为实现这一目标的最佳方法可能是反射 API(也许我完全错了,告诉我......)我的问题是我无法弄清楚如何访问字段的名称(如果至少可能的话)这是我的代码:package testimport(     "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 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

使用类型,以获得StructField。StructField 的名称为

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

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


查看完整回答
反对 回复 2021-12-07
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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

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


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信