go-admin-team/go-admin-core

Config 配置解析优化问题

Opened this issue · 0 comments

问题描述

在 go-admin 的 Go 工程下的 Extend 结构体添加如下两个扩展配置,

type Extend struct {
	KafkaHost   string `yaml:"kafka_host"`
	Kafka       string `yaml:"kafka"`
	AMap        AMap   // 这里配置对应配置文件的结构即可
}

setting.yml 文件 extend 中添加如下配置,

  extend: # 扩展项使用说明
    kafka_host: localhost:9092
    kafka: localhost:9092

结果就是 Kafka 成员成功读取配置中的值,而 KafkaHost 将永远为空字符串。

问题原因

config/default.goInit 方法用于解析配置文件到结构体中,

func (c *config) Init(opts ...Option) error {
	c.opts = Options{
		Reader: json.NewReader(),
	}
	
  ...

	c.vals, err = c.opts.Reader.Values(c.snap.ChangeSet)
	if err != nil {
		return err
	}
	if c.opts.Entity != nil {
		_ = c.vals.Scan(c.opts.Entity)
	}

	return nil
}

config/reader/json/values.go 中将 yml 读取并转为 json,然后通过 json 解析的方式将值赋到结构体上,

func (j *jsonValues) Scan(v interface{}) error {
	b, err := j.sj.MarshalJSON()
	if err != nil {
		return err
	}
	return json.Unmarshal(b, v)
}

于是就有了上述问题。

解决方式

1. json tag

知道了上述使用的 json 解析方式,这个就不言而喻了,

type Extend struct {
	KafkaHost   string `yaml:"kafka_host" json:"kafka_host"`
	Kafka       string `yaml:"kafka"`
	AMap        AMap   // 这里配置对应配置文件的结构即可
}

2. 驼峰配置

如果没有配置 json tag,那么默认的解析方式是驼峰,首字母大小写都可以,

  extend: # 扩展项使用说明
    kafkaHost: localhost:9092
    kafka: localhost:9092

总结

ExtendConfig 结构体中的其他配置都存在这样的使用问题,超过一个单词的配置都可能导致使用者遇到上述问题。在 Go 语言中存在大量下划线的 tag 或者配置的命名习惯,如果使用者在使用时遇到了上述问题,不阅读解析过程的源代码是无法找到问题所在的,增加了开发者的学习成本,所以上述问题是值得优化的。