方法或构造函数级别的零处理?



我应该检查构造函数中的 nil 值,然后设置一个未导出的结构字段,还是通过在方法级别检查 nil 来使默认结构值有用?

type Foo struct{}
func (f *Foo) Baz() {}
var DefaultFoo = new(Foo)
type Bar struct {
Foo *Foo
}
func (b *Bar) Baz() {
if b.Foo == nil {
DefaultFoo.Baz()
} else {
b.Foo.Baz()
}
}

type Foo struct{}
func (f *Foo) Baz() {}
var DefaultFoo = new(Foo)
type Bar struct {
foo *Foo
}
func NewBar(foo *Foo) *Bar {
if foo == nil {
foo = DefaultFoo
}
return &Bar{foo}
}
func (b *Bar) Baz() {
b.foo.Baz()
}

我认为没有"正确"的答案。

话虽如此,Go 基本库中常见的方法是让对象在没有任何构造函数的情况下创建,在其字段中具有nilzero值,然后使方法具有使用或返回有用默认值的逻辑。

例如,看一下http.Client实现:

https://github.com/golang/go/blob/master/src/net/http/client.go

它基本上可以让您通过执行以下操作来创建新客户端:

client := &http.Client{}

然后,如果要覆盖默认值,则可以填充对象的字段,否则它将以不同的方法检查nil以提供默认行为,例如:

https://github.com/golang/go/blob/master/src/net/http/client.go#L195

func (c *Client) transport() RoundTripper {
if c.Transport != nil {
return c.Transport
}
return DefaultTransport
}

相关内容

  • 没有找到相关文章

最新更新