我有一个用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
选项类型,我无法判断是否在Options结构中设置了字段值。例如,BoolOption
设置为false还是未初始化?
一种可能的解决方案是为我的所有选项字段使用字符串。例如,BoolOption
将是"false"
而不是false
。然后我可以检查字符串的长度以检查它是否已初始化。
有更好的解决方案吗?
答案 0 :(得分:2)
对于检测未初始化的结构字段,某些类型具有零值,否则它们 nil
(地图和渠道需要make
d):
var i int // i = 0
var f float64 // f = 0
var b bool // b = false
var s string // s = ""
var m chan int// c = nil
有一张tour幻灯片很有用。
我认为您的问题涉及创建默认布尔值true
但是,为了您的利益,如果您将Option
结构传递给该函数,并且用户未指定选项,那么是它们将为false
默认情况下为""
。
一个解决方案是创建一个(nother)构造函数:func NewOptions(b bool, s string) Options
此构造函数会使bool默认为true
。
您还可以尝试使用枚举来模拟布尔值; 零值将为0
。因此type bool
结构值Options
代替BoolOption
,您可以使用int
:
const (
TRUE
FALSE
)
您也可以将UNINITIALIZED
设为零,但我认为您只想切换默认值,而不是检测到它未初始化。
因此,在检查Options
的值时,您可以写:
if opt.BoolOption == FALSE {
// Do something with the option
} else {
// The default option
}
更简单的一点是将BoolOption
变为notBoolOption
,默认为false。
或者,正如Olivia Ruth指出的那样,如果你将该字段作为指向布尔值的指针,它将保持nil
直到“初始化”。
答案 1 :(得分:1)
bool的默认值为false。如果您注意到每次运行代码时都将选项值覆盖为true。
字符串变量的默认值是&#34;&#34;。因此,如果检查字符串len(opts.StringOption) == 0
或opts.StringOption == ""
也可以。