前言:
该
encoding/json包使用反射(包
reflect)到读/写值,包括结构。其他也使用反射的库(例如TOML和YAML的实现)可能以类似的方式(或什至以相同的方式)运行,因此此处介绍的原理也适用于那些库。您需要使用所使用的库对其进行测试。
为简单起见,此处介绍的解决方案使用标准lib的
encoding/json。
一个优雅且“零努力”的解决方案是使用该
encoding/json程序包并将其
解编为“ prepared”(默认)配置的值 。
这可以处理您需要的一切:
- 配置文件中缺少值:默认适用
- 文件中给定的值将覆盖默认配置(无论该设置如何)
- 文件中显式覆盖零值优先(覆盖非零默认配置)
为了演示,我们将使用以下配置结构:
type Config struct { S1 string S2 string S3 string S4 string S5 string}和默认配置:
var defConfig = &Config{ S1: "", // Zero value S2: "", // Zero value S3: "abc", S4: "def", S5: "ghi",}假设该文件包含以下配置:
const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}`该文件的配置覆盖
S2,
S3和
S5领域。
加载配置的代码:
conf := new(Config) // New config*conf = *defConfig // Initialize with defaultserr := json.NewDeprer(strings.NewReader(fileContent)).Depre(&conf)if err != nil { panic(err)}fmt.Printf("%+v", conf)和输出(在Go Playground上尝试):
&{S1: S2:file-s2 S3: S4:def S5:file-s5}分析结果:
S1
默认情况下为零,文件中缺失,结果为零S2
默认为零,在文件中给定,结果是文件值S3
在配置中给出,在文件中被重写为零,结果为零S4
在配置中给出,在文件中丢失,结果是默认值S5
在配置中给出,在文件中给出,结果是文件值



