Go言語(Golang)では、複数の戻り値を返すことができるのですが、その代わり、Javaのような例外スローというものがないです。
といっても似たような機構はあり、Go言語では、エラーハンドリングの慣習としては、戻り値の最後に errorsパッケージで作ったエラーを返すというもの。
そして上位(呼び出し側)は、その戻り値をチェックするようです。
[calc/devide.go]
package calc
import "errors"
func Divide2(a int, b int) (int, int, error) {
if b == 0 {
return 0, 0, errors.New("Do not divide by 0.")
}
return a / b, a % b, nil
}
上記のように最後の戻り値として「error」オブジェクトを返すようにします。
その際、
- エラーがない場合は「nil値」
- エラーがある場合は「errors.New() 関数で生成したエラー」
をリターンします。
package main
import (
"fmt"
"os"
"test1/calc"
)
func main() {
...(中略)...
value1, value2, err := calc.Divide2(20, 3)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("%d, %d\n", value1, value2)
}
value1, value2, err2 := calc.Divide2(20, 0)
if err2 != nil {
fmt.Println(err2)
} else {
fmt.Printf("%d, %d\n", value1, value2)
}
}
上記のように関数の戻り値で errの値が nil値かどうかで判定して、
- nil値(つまりエラーではない)場合は通常処理
- nil値ではない場合はエラー処理
を行えばよいようです。
確かにこれだと簡単にエラー処理をできそうですね。
慣習が分かれば、どういう風に関数の戻り値を設計すればよいかもわかりますので。