2016-01-13 146 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 == ""

相關問題