2016-05-10 30 views

回答

2

記住,error是一個接口。而零接口是以字節爲單位的零長度(並且空的結構也是零長度的)。

這意味着GC無論如何都不需要額外的工作來清理。

這是個人喜好,甚至還有使用名爲返回值第三種方式:

func foo() (err error) { 
    ... 
} 

雖然我強烈建議不要使用這種模式。

就我個人而言,我更喜歡inline的慣用特質,如果我可以,並且當模式允許我使用它時真的很享受。但要記住,其他變量的作用域僅適用範圍內的,如果:

if temp, err := other(); err != nil { 
    // can only use temp here 
    ... 
} 

(除非您定義的瓦爾時間提前,這違背了反正內嵌的目的)

但多數情況下,我需要保持temp評估後圍:

temp, err := something() 
if err != nil { 
    ... 
} 
// continue to use temp 

這意味着大多數的我的代碼看起來像上面。

但是,當我碰到允許它的模式時,你打賭我會使用它。例如,BUFIO的Writer.WriteByte

if err := writer.WriteByte(b); err != nil { 
    ... 
} 

writerb在外部範圍被定義,最有可能與自己err檢查。在評估範圍之外定義err的零點。

限制err值的範圍就像習慣用法,當你可以使用它時。

+0

命名返回值就像標籤一樣,當你需要它們時非常有用,但你幾乎從不這樣做。 –

+0

正確。但我在項目中看到很多代碼,人們把它作爲標準。 Go的博客建議不要使用它們,除非在特殊情況下允許代碼更易於閱讀(通常意味着不會)。 – eduncan911

+1

當我需要修改函數中的返回值時,我幾乎只使用命名的返回值。 「延遲函數可以讀取並分配給返回函數的返回值。」 https://blog.golang.org/defer-panic-and-recover –