Go言語学習12日目:error型と仲良くなる日。「if err != nil」に慣れる練習をしてみた。

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.Newfmt.Errorf で自由にエラーメッセージを定義できる
  • エラーハンドリングは「防御」ではなく「前提として組み込むもの」だと考えると納得しやすい

これ以下は広告を含みます。