Go の関数は func で宣言され、特徴的な機能は 複数の戻り値 です — 関数は一度に複数の値を返すことができます。これは特に Go のエラーハンドリングを定義する (result, error) イディオムで広く使われています。
基本的な関数
go
{
a + b
}
{
+ name
}
func divide(a, b int) (int, error) { // returns BOTH a result AND an error
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil // nil error = success
}
// callers handle both — the ubiquitous Go error pattern
result, err := divide(10, 2)
if err != nil {
log.Fatal(err) // handle the error
}
fmt.Println(result)
(value, error) を返すことは Go のエラーハンドリング THE イディオムです — 例外の代わりに、関数はエラーを呼び出し元が明示的にチェックする値として返します。これによってエラーハンドリングが可視化され、暗黙のうちに無視されることがなくなります。
// many built-ins return (value, ok) — a boolean for "did it work?"
value, ok := myMap["key"] // ok = false if the key is missing
if ok { ... }
v, ok := someInterface.(string) // type assertion with ok
func split(sum int) (x, y int) { // named returns
x = sum * 4 / 9
y = sum - x
return // "naked return" — returns the named values
}
func sum(nums ...int) int { // accepts any number of ints
total := 0
for _, n := range nums {
total += n
}
return total
}
sum(1, 2, 3) // 6
sum(nums...) // spread a slice into args
var op func(int, int) int = add // assign functions to variables
func apply(fn func(int) int, x int) int { return fn(x) } // pass as arguments
Go の関数は中心的なもので、複数の戻り値 は言語の定義的な機能の 1 つです — これは (result, error) イディオムを可能にします。これは Go のエラーハンドリングの方法(例外の代わりにエラーを値として明示的にチェック)です。
このパターンは事実上すべての Go プログラムで使用され、エラーハンドリングを可視化し、意図的にします。
関連する comma-ok イディオム(value, ok :=)はあちこちに現れます(マップアクセス、型アサーション、チャネル受信)。
複数の戻り値、エラーパターン、名前付き戻り値、可変長引数関数、第一級関数を理解することは、イディオム的な Go を読み書きするために必須です — そしてエラー・アズ・バリュー哲学は Go と例外ベースの言語の間で最も重要な概念的な違いの 1 つです。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する