Go言語では、例外(try/catch)は使いません。
代わりに「エラーを戻り値で返す」という、とてもGoらしいスタイルが基本になります。
今日はこの error
型にとことん慣れるために、小さな関数をいくつか書いてみることにしました!
キーワードは「if err != nil」
1. 基本パターン:割り算のエラーチェック
package main import ( "errors" "fmt" ) func divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("0で割ることはできません") } return a / b, nil } func main() { result, err := divide(10, 0) if err != nil { fmt.Println("エラー:", err) return } fmt.Println("結果:", result) }
Goの基本スタイル:「値, error」の形で返す → 「if err != nil」でチェック
2. スライスの平均値を計算(空スライスへの対処)
func average(nums []float64) (float64, error) { if len(nums) == 0 { return 0, errors.New("データが空です") } sum := 0.0 for _, n := range nums { sum += n } return sum / float64(len(nums)), nil } func main() { data := []float64{} avg, err := average(data) if err != nil { fmt.Println("エラー:", err) return } fmt.Println("平均:", avg) }
ポイント:処理前に「ありえない状態」をチェックするクセをつける!
3. ユーザー名検索(マップの存在確認)
func findUser(name string, users map[string]string) (string, error) { val, ok := users[name] if !ok { return "", fmt.Errorf("ユーザー %s は存在しません", name) } return val, nil } func main() { users := map[string]string{ "たろう": "管理者", "はなこ": "一般ユーザー", } role, err := findUser("じろう", users) if err != nil { fmt.Println("エラー:", err) return } fmt.Println("ユーザーの権限:", role) }
fmt.Errorf を使うとエラーメッセージに動的な情報を含められて便利!
「エラーは戻り値でくる」が最初は戸惑うけど…
- 「失敗するかもしれない処理」は全部
if err != nil
で受け止めるって、逆に安心感ある! - Goの「エラー処理は普通の処理と同じラインにある」って考え方、じわじわ好きかも。。
今日のまとめ
Go言語12日目の学習ポイント
- エラーは
error
型で戻り値として扱う if err != nil
で都度チェックするのがGoの流儀errors.New
やfmt.Errorf
で自由にエラーメッセージを定義できる- エラーハンドリングは「防御」ではなく「前提として組み込むもの」だと考えると納得しやすい