“构造函数”函数应该返回一个错误还是一个空值?
问题描述:
鉴于构造函数如“构造函数”函数应该返回一个错误还是一个空值?
func NewSomething(name, color string) *Something {
s := Something{name, color}
return &s
}
如果这种功能包括完整性检查,如&name == nil
,或len(name) == 0
?如果这个函数应该包含健全性检查,应该从构造函数返回什么值? A nil
值或错误(errors.New(...)
)?下面是一个例子。
func NewSomething(name, color string) *Something {
if &name == nil || len(name) == 0 {
return nil
}
if &color== nil || len(color) == 0 {
return nil
}
s := Something{name, color}
return &s
}
答
返回error
。使用不同的值(例如nil
)来表示错误并不是惯用的。
func NewSomething(name, color string) (*Something, error) {
if name == "" {
return nil, errors.New("bad name")
}
if color == "" {
return nil, errors.New("bad color")
}
s := Something{name, color}
return &s, nil
}
除了:表达式&anyVariable == nil
始终计算为true
。将检查简化为len(color) == 0
或color == ""
。
stdlib中的示例:[url.Parse](https://golang.org/pkg/net/url/#Parse),['http.NewRequest'](https://golang.org/pkg/ net/http /#NewRequest)等等。 – JimB
导致我问这个问题的是[这个例子](https://golang.org/doc/effective_go.html#composite_literals)。该示例不会返回错误,而是返回一个“nil”值,以便您看到我的困惑。这些例子有助于阐明一个正确的函数应该是什么样的,在这个用例中,谢谢。 –
@ battery.cord在同一文档中的[错误部分](https://golang.org/doc/effective_go.html#errors)表示返回错误而不是零是很好的样式。您链接的示例出现在错误部分之前。也许作者掩盖了错误处理的问题,因为后面会讨论这个话题。 –