Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Config 配置解析优化问题 #63

Open
DreamerLWJ opened this issue Aug 19, 2023 · 0 comments
Open

Config 配置解析优化问题 #63

DreamerLWJ opened this issue Aug 19, 2023 · 0 comments

Comments

@DreamerLWJ
Copy link

问题描述

在 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 或者配置的命名习惯,如果使用者在使用时遇到了上述问题,不阅读解析过程的源代码是无法找到问题所在的,增加了开发者的学习成本,所以上述问题是值得优化的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant