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 を与えた場合だ。ちゃんとエラーが表示されている。