gpt4 book ai didi

go - 检测未初始化的结构字段

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

我有一个用 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)

我的问题是,对于 boolint 选项类型,我无法判断是否在 Options 结构中设置了字段值。例如,BoolOption 是设置为 false 还是只是未初始化?

一种可能的解决方案是为我的所有选项字段使用字符串。例如,BoolOption 将是 "false" 而不是 false。然后我可以检查字符串的长度以检查它是否已初始化。

有没有更好的解决方案?

最佳答案

对于检测未初始化的结构字段,通常某些类型具有零值,否则它们是nil ( map 和 channel 需要maked):

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有用的幻灯片。

我认为您的问题涉及创建一个默认 bool 值 true


然而,为了您的利益,如果您将 Option 结构传递给该函数,并且用户没有指定选项,那么它们将是 yes>false"" 默认情况下。

一个解决方案是创建一个(另一个)构造函数:func NewOptions(b bool, s string) Options

此构造函数将使 bool 默认 true

您也可以尝试使用枚举来模拟 bool 值; 零值 将为0。因此,对于 Options 结构值 BoolOption,您可以使用 int 而不是 type bool:

const (
TRUE
FALSE
)

您也可以将 UNINITIALIZED 设置为零,但我认为您只是想切换默认值,而不是检测它是否未初始化。

因此,当检查 Options 的值时,您可以这样写:

if opt.BoolOption == FALSE {
// Do something with the option
} else {
// The default option
}

更简单的方法是将 BoolOption 设为 notBoolOption,并将默认值为 false。


或者,正如 Olivia Ruth 指出的那样,如果您将该字段作为指向 bool 值的指针,它将保持 nil 直到“初始化”。

关于go - 检测未初始化的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43854117/

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