gpt4 book ai didi

go - 当 yaml 已经初始化值时,如何在 Golang 中测试默认值?

转载 作者:IT王子 更新时间:2023-10-29 01:37:41 25 4
gpt4 key购买 nike

我正在编写守护进程的配置处理程序并利用 yaml 包来执行此操作。导入我的文件是这样的:

package daemon

import (
"ioutil"
"log"

"gopkg.in/yaml.v2"
)

type daemonConfig struct {
BindAddress string `yaml:"bind_address"`
BindPort int `yaml:"bind_port"`
VerifySSL bool `yaml:"verify_ssl"`
}

我可以像这样轻松地从我的 YAML 文件中解码数据:

func (config *daemonConfig) getConf() *daemonConfig {
yamlFile, err := ioutil.ReadFile("config.yaml")
if err != nil {
log.Fatal("Unable to open config.yaml:", err)
}
err = yaml.Unmarshal(yamlFile, config)
if err != nil {
log.Fatal("Failed to unmarshall config.yaml:", err)
}
config, err = setDefaults(config)

return config
}

我的问题是关于我的自定义 setDefaults 函数。如果未提供字段,例如 bind_portbind_address,我想将它们设置为默认值:

func setDefaults(config *daemonConfig) (*daemonConfig, error) {
if len(config.BindAddress) <= 0 {
config.BindAddress = "0.0.0.0"
}
if config.BindPort == 0 {
config.BindPort = 9999
}

return config, nil
}

您会注意到我没有将默认值设置为 verify_ssl;当 yaml 对此进行解码并且找不到该字段时,它将 bool 初始化为 false,这与我想要的默认值恰恰相反要的行为。我希望用户明确将 SSL 验证设置为关闭,而不是在未指定的情况下默认关闭它。如果我有一个完全空的 config.yaml,并希望设置默认值,它总是会将 verify_ssl 设置为 false(此日志来自应用程序的其他地方) :

2019/02/19 03:56:08 Currently loaded config: {0.0.0.0 9999 false}

如果正在解码的 YAML 字段中不存在该字段,我将如何检查该行是否存在?我可以手动读取文件并首先检查该参数,但我想知道是否有更优雅的方式来处理我所拥有的;否则,我将只使用 ioutil 和字符串检查来完成它。谢谢!

最佳答案

感谢Thomasmh-cbon我发现我可以为此使用一个指针。如果我更改我的 VerifySSL 字段以使用指针并添加 omitempty:

type daemonConfig struct {
BindAddress string `yaml:"bind_address"`
BindPort int `yaml:"bind_port"`
VerifySSL *bool `yaml:"verify_ssl",omitempty`
}

我可以简单地取消引用结构中的字段以获取未编码的 yaml 的真实值。设置默认值非常简单:

func setDefaults(config *daemonConfig) (*daemonConfig, error) {
if len(config.BindAddress) <= 0 {
config.BindAddress = "0.0.0.0"
}
if config.BindPort == 0 {
config.BindPort = 9999
}
if config.VerifySSL == nil {
ssl := true
config.VerifySSL = &ssl
}

return config, nil
}

如果加载到文件中,config.VerifySSL 将包含 bool 的地址,因此它不会是 nil,如果它确实根本不在文件中,那么该字段就是nil,我可以设置它或通过指针获取它。

编辑:请注意,如果您的 VerifySSL 指针为 nil,则不能像这样分配它:

*config.VerifySSL = true

这是取消引用 nil 指针。我已经更新了解决方案以包含更易于管理的内容。

关于go - 当 yaml 已经初始化值时,如何在 Golang 中测试默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54765161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com