NamedGoはパラメータを返します

Goでは、名前付きの結果パラメーターを持つ関数を記述できます。

からの2つの例スペック

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結果は成功を示します。 ANerror多くの場合、説明は必要ありません。


追加のリソース:


その他のチュートリアル: