Config 配置解析优化问题
Opened this issue · 0 comments
DreamerLWJ commented
问题描述
在 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.go
的 Init
方法用于解析配置文件到结构体中,
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
总结
Extend
或 Config
结构体中的其他配置都存在这样的使用问题,超过一个单词的配置都可能导致使用者遇到上述问题。在 Go 语言中存在大量下划线的 tag 或者配置的命名习惯,如果使用者在使用时遇到了上述问题,不阅读解析过程的源代码是无法找到问题所在的,增加了开发者的学习成本,所以上述问题是值得优化的。