Go には例外機構がない。じゃ、どうやってエラー処理をするかというと、多値を使って関数の返り値としてエラーを返すようにする。
例を見てみよう。
package main import ( "fmt" "errors" ) func fact(n int) (int, error) { if n < 0 { return 0, errors.New("fact : domain error") } a := 1 for ; n > 1; n-- { a *= n } return a, nil } func main() { for x := 10; x >= -1; x-- { v, err := fact(x) if err != nil { fmt.Println(err) } else { fmt.Println(v) } } }
fact
関数は階乗を求める関数だけど、値を2つ返す。求めたい関数の値とエラーだ。通常はエラーとして nil
を返すけど、引数が0より小さかった場合はゼロ値と nil
でないエラーを返す。
試してみよう。
^o^ > go run err_fact.go 3628800 362880 40320 5040 720 120 24 6 2 1 1 fact : domain error
最後の行が fact
に -1
を与えた場合だ。ちゃんとエラーが表示されている。