トラック
/
Go
Go
/
シラバス
/
複数の戻り値
複数

複数の戻り値 の Go

{other: "%{count}個の演習"}

複数の戻り値について

Goの関数とメソッドは、複数の戻り値を返すことができます:

func GetCard() (Card, error) { ... }

すべての戻り値は、順番に代入し、カンマで区切る必要があります:

card, err := GetCard()

ブランク識別子

代入の各位置では、変数を宣言します。 宣言した変数を使わないことは、Goでは許されていません。 その戻り値をスキップするには、変数名の代わりにブランク識別子_を使います。

card, _ := GetCard() // error intentionally ignored
_, err := GetCard()  // card ignored, only checking for error

エラー処理

errorは組み込みのインターフェースです。 エラーがnilであればエラーは発生しなかったことを意味し、nil以外の値であれば何か問題が起きたことを意味します。 慣例として、失敗する可能性のある関数は、最後の戻り値としてerrorを返すべきです。 呼び出し元は、他の戻り値を使う前に、それを確認する必要があります:

card, err := GetCard()
if err != nil {
    // unsafe to use card here
    return err
}
// safe to use card here

カンマOKイディオム

2値代入のパターンは、errorの処理以外にも現れます。 マップの参照、型アサーション、チャネルの受信はすべて、成功またはデータの有無を示すために、慣例でokと名付けられた2つ目の真偽値を使います:

m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"]  // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int)     // ok is false
v, ok := <-ch // ok is false if ch is closed and empty

名前付き戻り値

戻り値には、関数シグネチャで名前を付けることもできます。 これらの変数は、関数本体の中でアクセスできます。

func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return quotient, remainder
}

名前付き戻り値は、それぞれの戻り値の位置が何を意味するかを示します。 これらは、値を書かずに済ませる裸のreturnと組み合わせて使うこともできます。 裸のreturnは、名前付き変数の現在の値を暗黙的に返します:

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

長い関数では、何が返されているのか分かりにくいため、裸のreturnは可読性を損ないがちです。 関数が短く、シグネチャが常に目に入る場合を除いて、明示的な戻り値を優先しましょう。

さらに学ぶには、Go by Example: Multiple Return Values、Effective Go: Multiple Returns、またはTour of Goをチェックしてみましょう。

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます