命名為Go返回參數

在Go中,您可以編寫具有命名結果參數的函數。

來自的兩個例子規格

func complexF3() (re float64, im float64) {
    re = 7.0
    im = 4.0
    return
}

func (devnull) Write(p []byte) (n int, _ error) { n = len(p) return }

使用此語法有許多優點。

您不必手動分配返回變量,因為將它們命名為結果類型,當函數開始時它們會自動以其類型的零值初始化。

命名返回參數作為隱式文檔非常出色:您知道函數直接從其簽名返回什麼,因為命名有助於理解代碼。

如果一個函數有多個退出點,則無需編寫所有參數,只需return(稱為勉強回報)。你還在能夠顯式列出返回的值,並且可能應該這樣做,以防止難以閱讀的代碼。如建議Go編程語言

[…]有很多return語句和幾個結果,裸返回可以減少代碼重複,但是很少使代碼更易於理解。 […]最好謹慎使用裸露的退貨

一個例子:

func something(n int) (ret int, m string, err error) {
    if n == 0 {
        err = errors.New("Houston, we have a problem!")
        return 0, "", err
    }
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>

<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#a6e22e">err</span>

}

或無回報:

func something(n int) (ret int, m string, err error) {
    if n == 0 {
        err = errors.New("Houston, we have a problem!")
        return
    }
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>

<span style="color:#66d9ef">return</span>

}

在這兩種情況下,代碼都比以下代碼更整潔,更易讀

func something(n int) (int, string, error) {
    var ret int
    var m string
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">n</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> {
    <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">errors</span>.<span style="color:#a6e22e">New</span>(<span style="color:#e6db74">"Houston, we have a problem!"</span>)
    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#a6e22e">err</span>
}

<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>

<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#66d9ef">nil</span>

}

當心在函數內部使用新的聲明對參數進行陰影處理的風險。

那麼,什麼時候應該使用它們?在程序的整體設計中對您有意義。我讓Go編程語言用報價回复:

[…]不一定總是只為文檔命名多個結果。例如,約定規定最終bool結果表明成功;一個error通常不需要解釋。


其他資源:


更多教程: