エラー処理

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