Go言語学習14日目:関数設計の総復習!複数戻り値・インターフェース・エラー処理をまとめて実践してみた。

Go言語学習もついに14日目に到達しました!

今まではコチラ

kunio-ud-all.com

今日のテーマはズバリ、総復習&深掘り
これまでに学んできた知識を活かして、ちょっと複雑な関数設計にチャレンジします!


目標:学んだ要素を全部使って、評価レポートを生成する関数を作る!

実現したいこと:
  • 構造体でユーザー情報を管理(名前・年齢・スコア)
  • スコアに応じて評価(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言語の書き方がなじんできました。ようやく。


(以下、広告になります。)