Go言語学習、今日は13日目!
テーマはズバリ、エラーハンドリングと関数の再実践です。
Go言語らしい if err != nil
の書き方にもだいぶ慣れてきた頃ですが、
今日はこれまでの知識を活かして、ちょっとだけ複雑な処理をコードで組み立ててみました!
今まではコチラ
今日のミッション
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
で丁寧に対応 - 実際の業務でも「入力バリデーション → 処理 → 結果と評価」という流れはよくある
- 関数で処理を分けておくと、テストしやすくて見通しもよい
(以下は広告を含みます。)