Go言語学習13日目:エラー処理&複数戻り値の関数

Go言語学習、今日は13日目
テーマはズバリ、エラーハンドリングと関数の再実践です。

Go言語らしい if err != nil の書き方にもだいぶ慣れてきた頃ですが、
今日はこれまでの知識を活かして、ちょっとだけ複雑な処理をコードで組み立ててみました!

今まではコチラ

kunio-ud-all.com


今日のミッション

  • error を返す関数をもう一度じっくり書く
  • 複数の値(たとえば評価や計算結果など)を返す関数を作る
  • if err != nil を自然に使えるようになる

練習課題:ユーザーの入力値からBMIを計算し、評価を返す関数を作る!

やりたいこと:
  • 身長体重 を受け取って BMI を計算
  • BMI の数値と評価("標準", "肥満", "低体重"など)を返す
  • 入力値がマイナスや0ならエラーを返す

実装コード:
package main

import (
    "errors"
    "fmt"
    "math"
)

// BMI を計算し、数値と評価を返す関数
func calcBMI(heightCm, weightKg float64) (float64, string, error) {
    if heightCm <= 0 || weightKg <= 0 {
        return 0, "", errors.New("身長と体重は正の値で入力してください")
    }

    heightM := heightCm / 100
    bmi := weightKg / math.Pow(heightM, 2)

    var status string
    switch {
    case bmi < 18.5:
        status = "低体重"
    case bmi < 25.0:
        status = "標準体重"
    case bmi < 30.0:
        status = "肥満(1度)"
    default:
        status = "肥満(2度以上)"
    }

    return bmi, status, nil
}

func main() {
    cases := []struct {
        height float64
        weight float64
    }{
        {170, 60},
        {160, 45},
        {175, 90},
        {0, 65},    // エラーケース
        {180, -5},  // エラーケース
    }

    for _, c := range cases {
        bmi, status, err := calcBMI(c.height, c.weight)
        if err != nil {
            fmt.Println("エラー:", err)
            continue
        }
        fmt.Printf("身長: %.1fcm 体重: %.1fkg → BMI: %.2f(%s)\n", c.height, c.weight, bmi, status)
    }
}

実行結果:

身長: 170.0cm 体重: 60.0kg → BMI: 20.76(標準体重)
身長: 160.0cm 体重: 45.0kg → BMI: 17.58(低体重)
身長: 175.0cm 体重: 90.0kg → BMI: 29.39(肥満(1度))
エラー: 身長と体重は正の値で入力してください
エラー: 身長と体重は正の値で入力してください

今日の学びポイント

複数戻り値 × エラー処理のポイント
  • Goでは func(...) (値1, 値2, error) のように複数値を返せる
  • エラー処理は if err != nil で丁寧に対応
  • 実際の業務でも「入力バリデーション → 処理 → 結果と評価」という流れはよくある
  • 関数で処理を分けておくと、テストしやすくて見通しもよい

(以下は広告を含みます。)