Go言語学習もついに14日目に到達しました!
今まではコチラ
今日のテーマはズバリ、総復習&深掘り。
これまでに学んできた知識を活かして、ちょっと複雑な関数設計にチャレンジします!
目標:学んだ要素を全部使って、評価レポートを生成する関数を作る!
実現したいこと:
- 構造体でユーザー情報を管理(名前・年齢・スコア)
- スコアに応じて評価(A〜D)を返す関数を作成(複数戻り値あり)
- エラーハンドリングで異常入力を防ぐ
- インターフェースを使って評価ロジックを切り替え可能にする(汎用化)
Step 1:構造体でユーザー情報を表現
type User struct { Name string Age int Score int }
Step 2:評価ロジックのインターフェースを定義
type Evaluator interface { Evaluate(score int) (string, error) }
Step 3:標準評価と特別評価の実装
type StandardEvaluator struct{} func (se StandardEvaluator) Evaluate(score int) (string, error) { if score < 0 || score > 100 { return "", fmt.Errorf("スコアが不正です: %d", score) } switch { case score >= 90: return "A", nil case score >= 70: return "B", nil case score >= 50: return "C", nil default: return "D", nil } }
Step 4:レポートを作る関数(複数の値を返す+エラー処理)
func generateReport(user User, e Evaluator) (string, error) { grade, err := e.Evaluate(user.Score) if err != nil { return "", err } status := "成人" if user.Age < 18 { status = "未成年" } report := fmt.Sprintf("%s(%s)さんの評価: スコア=%d → 評価=%s", user.Name, status, user.Score, grade) return report, nil }
Step 5:全体の実行コード!
package main import ( "fmt" ) func main() { users := []User{ {"たろう", 20, 85}, {"はなこ", 17, 92}, {"じろう", 25, -5}, // エラー } evaluator := StandardEvaluator{} for _, u := range users { report, err := generateReport(u, evaluator) if err != nil { fmt.Printf("エラー(%s): %v\n", u.Name, err) continue } fmt.Println(report) } }
実行結果:
たろう(成人)さんの評価: スコア=85 → 評価=B はなこ(未成年)さんの評価: スコア=92 → 評価=A エラー(じろう): スコアが不正です: -5
今日のまとめ
- 複数の戻り値(値+エラー)を使いこなす
- インターフェースを定義して評価ロジックを汎用化
- 構造体+関数で現実的なデータ構造と処理を分離
- エラーハンドリングで異常系を丁寧にケア
- 「関数を組み合わせて大きな機能を作る」感覚がつかめてきた!
ほんの少し、Go言語の書き方がなじんできました。ようやく。
(以下、広告になります。)