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

Go 方法或构造函数级别的零处理?,go,struct,null,conventions,Go,Struct,Null,Conventions,我应该在构造函数中检查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.Fo

我应该在构造函数中检查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()
    }
}

我认为没有一个“正确”的答案

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

查看http.Client的
实现,例如:

基本上,您只需执行以下操作即可创建新客户端:

client := &http.Client{}
如果要覆盖默认值,则可以填充对象的字段,否则它将使用不同的方法检查
nil
,以提供默认行为,例如:

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