检测未初始化的结构域

时间:2017-05-08 17:47:28

标签: go

我有一个用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。然后我可以检查字符串的长度以检查它是否已初始化。

有更好的解决方案吗?

2 个答案:

答案 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) == 0opts.StringOption == ""也可以。

https://play.golang.org/p/jifZZvoBVZ