Go言語学習6日目:エラー処理付き関数にチャレンジしてみた(関数の設計に少しずつ慣れていく)

Go言語学習も6日目に突入しました!
今日のテーマは、昨日に引き続き エラーハンドリング

kunio-ud-all.com

そして、関数の書き方・使い方をちょっと応用してみる日です!

参考にしているのは、毎度おなじみ Go Tourのリンクはこちら。

go-tour-jp.appspot.com

今日も30分、少しずつ理解を深めていきます!!!


「複数の値を返す関数」+「エラー処理」ってどう書くの?

これまでにも出てきたこの形:

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("0で割ることはできません")
    }
    return a / b, nil
}

Goではこういう 「値+error」 で返すのが超基本とのこと。

result, err := divide(10, 0)
if err != nil {
    fmt.Println("エラー:", err)
} else {
    fmt.Println("結果:", result)
}

この「if err != nil パターン」に慣れておくことが超大事なんですよね。。


練習①:合計&平均を同時に返す関数(スライス活用)

func sumAndAverage(numbers []int) (int, float64, error) {
    if len(numbers) == 0 {
        return 0, 0, errors.New("空のスライスでは計算できません")
    }

    sum := 0
    for _, n := range numbers {
        sum += n
    }

    avg := float64(sum) / float64(len(numbers))
    return sum, avg, nil
}

func main() {
    nums := []int{10, 20, 30, 40, 50}
    sum, avg, err := sumAndAverage(nums)
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }
    fmt.Printf("合計: %d, 平均: %.2f\n", sum, avg)
}
  • 戻り値が3つ(int, float64, error)でも全然OK!
  • error を最後に置くのがGoの書き方ルール
  • スライスの長さチェックでエラーを返すのが丁寧な書き方

関数の使い方も少しずつ「部品化」していけると、読みやすくて再利用しやすいコードに近づいていく気がします。。


練習②:指定した数の偶数だけをスライスにして返す

ちょっとした処理を関数にまとめてみました👇

func filterEven(numbers []int) ([]int, error) {
    if len(numbers) == 0 {
        return nil, errors.New("空のスライスです")
    }

    var evens []int
    for _, n := range numbers {
        if n%2 == 0 {
            evens = append(evens, n)
        }
    }

    if len(evens) == 0 {
        return nil, errors.New("偶数が見つかりませんでした")
    }

    return evens, nil
}

func main() {
    nums := []int{1, 3, 5, 7, 8}
    evens, err := filterEven(nums)
    if err != nil {
        fmt.Println("エラー:", err)
    } else {
        fmt.Println("偶数:", evens)
    }
}

「ちょっとした処理でも関数に分けてみる」ことが、Goに慣れる第一歩!


今日のまとめ

Go言語6日目の学習ポイントまとめ

  • func xxx(...) (値, error) の形式に慣れてきた!
  • 複数の値(合計・平均など)を同時に返す関数も簡単に書ける
  • 「エラーが出そうな条件は先にチェックする」書き方が丁寧
  • 小さな処理でも関数化して、読みやすいコードを目指そう

いやぁ、トライキャッチに任せないで、自分で常にエラーをnilでも返すと思うと、チームの人によってはtryを書かない人もいるからいいかも。 構文で縛るというのは。

(この記事は広告を含みます)