Day 2: イディオマティックGo - 課題

チャレンジ1: リファクタリング

以下のコードをイディオマティックGoに書き直してください。

package main

type user struct {
    user_name string
    user_age  int
}

func (u *user) GetUserName() string {
    return u.user_name
}

func (u *user) SetUserName(name string) {
    u.user_name = name
}

func ProcessUser(u *user) error {
    if u.user_name != "" {
        if u.user_age > 0 {
            return nil
        } else {
            return errors.New("Invalid age")
        }
    } else {
        return errors.New("Empty name")
    }
}

修正すべき点

  • 命名規則(スネークケース、Get接頭辞)
  • エクスポートの整合性
  • ネストの深さ(早期リターン)
  • エラーメッセージの形式

---

チャレンジ2: オプションパターンの実装

HTTPクライアントをオプションパターンで実装してください。

要件

  • Client構造体を定義(httpClient, baseURL, timeoutフィールド)
  • Option型を定義(関数オプションパターン)
  • WithTimeoutオプションを実装
  • WithBaseURLオプションを実装
  • NewClientコンストラクタを実装(デフォルト値付き)

使用例

client := NewClient(
    WithTimeout(60*time.Second),
    WithBaseURL("https://api.example.com"),
)

---

チャレンジ3: defer, panic, recoverの実践

以下の要件を満たすプログラムを実装してください。

要件

  • SafeExecute関数を実装
- 任意の関数を受け取り、安全に実行する - panic時はrecoverして、エラーとして返す
  • MustParse関数を実装
- 文字列を整数に変換する - 変換失敗時はpanicする
  • main関数で両方をテストする

期待される動作

SafeExecute with valid function: success
SafeExecute with panic function: error - panic occurred: test panic
MustParse("123"): 123
MustParse("abc"): panic!

---

チャレンジ4: インターフェースの設計

データストレージのインターフェースを設計してください。

要件

  • 小さいインターフェースに分割する
- Getter: Get(key string) ([]byte, error) - Setter: Set(key string, value []byte) error - Deleter: Delete(key string) error
  • 組み合わせインターフェースを定義
- ReadWriter: GetterとSetterを組み合わせ - Storage: 全てを組み合わせ
  • MemoryStorageとして実装する
  • ---

    提出について

  • 各チャレンジを別々のファイルとして作成してください
  • すべてのコードがgo buildでエラーなくコンパイルできることを確認してください
  • go fmtでフォーマットしてから提出してください
  • エクスポートされた識別子にはコメントを付けてください