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
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をチェックしてみましょう。