【发布时间】:2017-05-08 17:47:27
【问题描述】:
我有一个用 golang 编写的服务,可以使用一些选项进行初始化。选项作为结构传递给构造函数。构造函数使用未包含的选项字段的默认值。这是一个例子:
type Service struct {
options Options
}
type Options struct {
BoolOption bool
StringOption string
}
const (
DefaultBoolOption = true
DefaultStringOption = "bar"
)
func New(opts Options) *Service {
if !opts.BoolOption {
opts.BoolOption = DefaultBoolOption
}
if len(opts.StringOption) < 1 {
opts.StringOption = DefaultStringOption
}
return &Service{options: opts,}
}
...
// elsewhere in my code
o := Options{BoolOption: false,}
// sets s.options.BoolOption to true!!!
s := New(o)
我的问题是,对于bool 或int 选项类型,我无法判断选项结构中是否设置了字段值。例如,BoolOption 是设置为 false 还是未初始化?
一种可能的解决方案是对我的所有选项字段使用字符串。例如,BoolOption 将是 "false" 而不是 false。然后我可以检查字符串的长度以检查它是否已初始化。
有更好的解决方案吗?
【问题讨论】:
-
如果您希望它是显式可选的(并且您关心未初始化与默认值),您可能希望使用
*bool而不是bool。但这会让事情变得更难处理,所以请确保你需要。 -
@OliviaRuth:是的,我认为这是我唯一真正的解决方案。但就像你说的,它让事情变得稍微复杂一些。也许有可选输入对我来说并不重要。
-
值得注意的是,如果布尔值的默认值为“true”,您可能应该反转布尔值。例如,如果布尔值是“logInput”,并且您希望它默认为 on,您可能应该将布尔选项设置为“noLog”并默认为 false。这遵循了让默认值有用的 Go 公理。
-
这里有两个选项,一个是使用字段指针,第二个是封装
Options结构并为记录/检查是否为的字段生成Get和Set方法设置。
标签: go