Goでは関数の戻り値にerror変数を返すパターンがよくあるらしい。
関数を呼び出す時にはそのerror変数がnilがどうかを確認してエラーハンドリングする。
例えば...
i, err := strconv.Atoi("42")
if err != nil {
fmt.Printf("couldn't convert number: %v\n", err)
return
}
fmt.Println("Converted integer:", i)
のような感じ。
実装方法はGoのチュートリアルの[A Tour of Go:Exercise: Errors] を見れば一通り説明されているのでそれを読めば一応理解はできる。
チュートリアルのなかで「負の値が与えられたとき、nil以外のエラー値を返すSqrt関数を作成」という演習がある。
error変数を返す為に必要なのは、
// 新しい型の作成
type ErrNegativeSqrt float64
// Errorメソッドの実装
func (e ErrNegativeSqrt) Error() string {
// fmt.Sprint(float64(e))
return fmt.Sprintf("cannot Sqrt negative number:%v", float64(e))
}
あとはSqrt関数内で必要に応じてメソッドを呼び出す。
func Sqrt(x float64) (float64, error) {
if x < 0 {
return 0, ErrNegativeSqrt(x)
}
以下略
}
そしてSqrt関数を呼び出す時はエラーハンドリングする。
if i, err := SqrtFunc(-2); err != nil {
log.Println(err)
} else {
fmt.Printf("%v", i)
}
//もしくは
i, err := SqrtFunc(-2)
if err != nil {
log.Println(err)
return
}
fmt.Printf("%v", i)