怎么修改go中的yaml⽂件_Go中的配置信息都是怎么进⾏处理
的?
在项⽬开发中,通常需要提供重要参数的配置功能,以适应⽤户的不同使⽤要求。常见的⽅式是程序读取配置⽂件或⽤户输⼊来对相关参数进⾏更改与配置。
在参数配置的⽣效性上,存在⼀套优先级逻辑:命令⾏参数>配置⽂件参数>硬编码参数。(站长polaris注:其实还有环境变量)
配置过程
⾸先,定义配置对象Config结构体
type Config struct {
LogLevel string `json:"log_level"`
Port    int    `json:"port"`
}
1. 硬编码
硬编码的⽅式⾮常简单,就是在⽣成Config对象时,将参数的值直接写⼊对象之中。
func DefaultConfig() *Config {
return &Config{
LogLevel: "info",音乐学专业
Port:    8080,
}
}
2. 配置⽂件张柏芝与谢霆锋
⽇常开发中,配置⽂件常见有以下⼏种格式:
json ⽂件
xml ⽂件
yaml ⽂件
toml ⽂件
ini ⽂件
在上⽂定义的Config结构体对象,在属性中定义了json的tag信息,因此可⽤于解析json格式的配置⽂件。对于其他的⽂件格式,相应地在Config结构体中配置对应的tag信息即可。
本例的配置信息写在config.json中,内容如下
{
"log_level": "debug",
"port": 9090
}
加载配置⽂件信息,利⽤json.Unmarshal⽅法,将配置⽂件中json信息绑定于Config对象(注意:只有⼤写开头的字段才具有json导出性)。
func loadConfig(configPath string) *Config {
cfg := Config{}
buf, err := ioutil.ReadFile(configPath)
if err != nil {
panic(err)
}
err = json.Unmarshal(buf, &cfg)
if err != nil {
panic(err)
}房地产估价师报名时间
return &cfg
读取配置文件失败}
3. 命令⾏读取
利⽤内置flag包,定义和读取⽤户的输⼊参数。
const (
nLog  = "log"
nPort = "p"
)
var (
logLevel = flag.String(nLog, "debug", "log level")
port    = flag.Int(nPort, 8080, "listen port")
cfgPath  = flag.String("path", "./config.json", "config file path")
)
func overrideConfig(cfg *Config) {
m := make(map[string]bool)
flag.Visit(func(f *flag.Flag) {
m[f.Name] = true
池间晶子})
if m[nLog] {
cfg.LogLevel = *logLevel
}
if m[nPort] {会计人员岗位职责
cfg.Port = *port
}
}
4. 运⾏
执⾏命令 go -log error -p 7070,其中-log参数和-p是通过flag包定义。
func main() {
flag.Parse()
cfg := DefaultConfig() // 硬编码
fmt.Println(cfg) // 输出&{info 8080}
if *cfgPath != "" {
cfg = loadConfig(*cfgPath) // 读取配置⽂件
}
fmt.Println(cfg) // 输出&{debug 9090}
overrideConfig(cfg) // 读取⽤户输⼊
fmt.Println(cfg) // 输出&{error 7070}
}
总结来说,参数⽣效过程如下图所⽰。
在实际参数更改过程中,基于安全,需要做参数检查⼯作。例如检查参数类型,参数值范围是否满⾜等。参数⽣效后,其值就会随着Config对象被程序执⾏于内存中,供全局使⽤,后续对参数的更改就是基于内存中值的修改。
推荐阅读
Go 创建对象时,如何优雅的传递初始化参数
喜欢本⽂的朋友,欢迎关注“Go语⾔中⽂⽹”:
Go语⾔中⽂⽹启⽤学习交流,欢迎加:274768166,投稿亦欢迎