Cou氏の徒然日記

ほのぼの日記ブログです。

Go言語の学習 その10 (エラーハンドリング)

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() {
...(中略)...
// 20 ÷ 3 = ? value1, value2, err := calc.Divide2(20, 3) if err != nil { fmt.Println(err) } else { fmt.Printf("%d, %d\n", value1, value2) } // 20 ÷ 0 = ? 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値ではない場合はエラー処理

を行えばよいようです。

 

確かにこれだと簡単にエラー処理をできそうですね。

慣習が分かれば、どういう風に関数の戻り値を設計すればよいかもわかりますので。