问题描述
在 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 或者配置的命名习惯,如果使用者在使用时遇到了上述问题,不阅读解析过程的源代码是无法找到问题所在的,增加了开发者的学习成本,所以上述问题是值得优化的。
问题描述
在 go-admin 的 Go 工程下的
Extend结构体添加如下两个扩展配置,setting.yml文件extend中添加如下配置,结果就是
Kafka成员成功读取配置中的值,而KafkaHost将永远为空字符串。问题原因
config/default.go的Init方法用于解析配置文件到结构体中,config/reader/json/values.go中将yml读取并转为json,然后通过json解析的方式将值赋到结构体上,于是就有了上述问题。
解决方式
1. json tag
知道了上述使用的
json解析方式,这个就不言而喻了,2. 驼峰配置
如果没有配置
json tag,那么默认的解析方式是驼峰,首字母大小写都可以,总结
Extend或Config结构体中的其他配置都存在这样的使用问题,超过一个单词的配置都可能导致使用者遇到上述问题。在 Go 语言中存在大量下划线的 tag 或者配置的命名习惯,如果使用者在使用时遇到了上述问题,不阅读解析过程的源代码是无法找到问题所在的,增加了开发者的学习成本,所以上述问题是值得优化的。