2016-01-13 145 views
3

鉴于构造函数如“构造函数”函数应该返回一个错误还是一个空值?

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 
} 
+2

stdlib中的示例:[url.Parse](https://golang.org/pkg/net/url/#Parse),['http.NewRequest'](https://golang.org/pkg/ net/http /#NewRequest)等等。 – JimB

+0

导致我问这个问题的是[这个例子](https://golang.org/doc/effective_go.html#composite_literals)。该示例不会返回错误,而是返回一个“nil”值,以便您看到我的困惑。这些例子有助于阐明一个正确的函数应该是什么样的,在这个用例中,谢谢。 –

+1

@ battery.cord在同一文档中的[错误部分](https://golang.org/doc/effective_go.html#errors)表示返回错误而不是零是很好的样式。您链接的示例出现在错误部分之前。也许作者掩盖了错误处理的问题,因为后面会讨论这个话题。 –

回答

4

返回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) == 0color == ""

相关问题