go-micro config包解读
直接使用config包中函数,例如Get/Load...
等函数,我们使用的是config包,默认变量DefaultConfig
。
初始化过程为:
1 | config/config.go |
重要的函数:Init
和run
。不过这里主要讲解Init即可,run为监听配置改变函数。
1 | func (c *config) Init(opts ...Option) error { |
看看Init()
中最重要的事就是设置了Load,这里也就是详细讲一下Load的操作,一般load是由我们在后期进行调用的。
-
初始化并设置opts,创建exit用于监听退出信号,设置opts
-
设置默认loader,c.opts.Loader默认是memory
memory.NewLoader()
[config/loader/memory/memory.go],这是后续关键函数。 -
调用c.opts.Loader.Load(),[config/loader/memory/memory.go],
详细讲解下Load
- 循环所有source,根据配置读取数据,更新m.sources,m.sets(
Format
为传入的编码),并watch()所有source - 调用
reload()
- 合并所有sets,函数
m.opts.Reader.Merge(m.sets...)
进行合并。 - 设置m.vals,m.snap
- 调用m.update(),更新之前的数据。
- 合并所有sets,函数
- 循环所有source,根据配置读取数据,更新m.sources,m.sets(
1 | source.ChangeSet |
source上的所有数据均转化为Json数据,故最终都会调用到config提供的读取json的方法。config/reader/json/values.go
。
1 | type jsonValues struct { |
json的读取库采用的是:go-simplejson
另外,在实际使用中,Get
函数中其调用的是j.sj.GetPath(path...)
。它可以读取到嵌套的json
数据。没有数据的话,不会报错,只能检测结构体里面的参数是否为nil
,但Get
返回的是一个reader.Value
的接口,不能根据判断其为nil来确定其有无数据(其结构体不为nil,是里面的data
字段为nil
)。
可以查看value的方法,可以调用Interface()
,获取data字段,判断是否有值。
注意
这里将引出一个问题,可以看到config目录中,有很多将Get
的返回值对比nil
的代码,其返回值是reader.Value
,是一个接口。
若是返回的是一个接口,此接口是nil,则intr只是内部value被赋值为nil
了, 其本身不为nil
的,想判断这种情况,必须是:
1 | if v != reader.Value(nil) { |
config包config/default.go
中,出现了此错误。
if c.vals == nil
本文标题:go-micro config包解读
文章作者:小师
发布时间:2020-12-01
最后更新:2022-05-04
原始链接:chunlife.top/2020/12/01/go-micro-config包解读/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可