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関数を実装
MustParse関数を実装
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でフォーマットしてから提出してください- エクスポートされた識別子にはコメントを付けてください
---