まとめ:一意なユーザー名
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 37/68。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単Goのセットのイディオムを使用して、重複するユーザー名を防ぐユーザー名登録システムを構築してください。このチャレンジでは、すべての登録においてユーザー名の一意性を保証する、堅牢なユーザー管理システムの作成方法を学びます。
2つの入力を受け取ります:
- カンマで区切られた既存のユーザー名を含む文字列(例:
"alice123,bob_dev,charlie2024,diana_codes") - カンマで区切られた新しいユーザー名登録の試行を含む文字列(例:
"eve_user,alice123,frank_dev,bob_dev,grace2024,alice123")
あなたのタスクは以下の通りです:
- Goのイディオムである
map[string]struct{}を使用して、登録済みユーザー名を保存するセットを作成します - 最初の入力文字列をカンマで分割して解析し、既存のユーザー名を取得します
- 空の構造体リテラル
{}を値として使用し、各既存ユーザー名をセットに追加します - 2番目の入力文字列をカンマで分割して解析し、新しい登録の試行を取得します
- 各登録の試行について、comma okイディオムを使用してユーザー名がセットに既に存在するかどうかを確認します
- 各試行の登録プロセスを表示します:
- ユーザー名が利用可能な場合:
"Registered: [username]"と表示し、セットに追加します - ユーザー名が既に存在する場合:
"Username taken: [username]"と表示します
- ユーザー名が利用可能な場合:
- すべての登録試行を処理した後、包括的なサマリーを表示します:
"Registration Summary:""Initial usernames: [initial_count]""Registration attempts: [attempts_count]""Successful registrations: [successful_count]""Rejected (duplicate): [rejected_count]""Total registered usernames: [total_count]"
- 最後に、システム内のすべての登録済みユーザー名をリストします:
- ヘッダー:
"All registered usernames:" - 各ユーザー名を個別の行に表示:
"@[username]"
- ヘッダー:
入力文字列をカンマで分割するには strings パッケージを使用してください。このチャレンジは、Goのセットのイディオムが、ユーザー登録システムにおける重複防止のための効率的なソリューションを提供し、ユーザー名の検証において高速なルックアップパフォーマンスを提供しながらデータの整合性を確保する方法を示しています。
自分で試してみよう
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
// 入力を読み込む
var existingUsernames string
var newRegistrations string
fmt.Scanln(&existingUsernames)
fmt.Scanln(&newRegistrations)
// 入力文字列を解析する
existing := strings.Split(existingUsernames, ",")
attempts := strings.Split(newRegistrations, ",")
// Goの慣用句を使用してセットを作成する
userSet := make(map[string]struct{})
// TODO: 以下にコードを記述してください
// 1. 既存のユーザー名をセットに追加する
// 2. 各登録試行を処理する
// 3. 各試行の登録結果を表示する
// 4. サマリーを計算して表示する
// 5. すべての登録済みユーザー名をリストする(一貫した出力のためにソートを忘れないこと)
}