回顾:唯一用户名
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 37 课,共 68 课。
挑战
简单使用 Go 集合惯用写法构建一个用户名注册系统,防止用户名重复。本挑战将展示如何创建一个可靠的用户管理系统,确保所有注册的用户名都不重复。
你会收到两个输入:
- 一个字符串,其中包含以逗号分隔的现有用户名(例如,
"alice123,bob_dev,charlie2024,diana_codes") - 一个字符串,其中包含以逗号分隔的新用户名注册尝试(例如,
"eve_user,alice123,frank_dev,bob_dev,grace2024,alice123")
你的任务是:
- 使用 Go 惯用写法
map[string]struct{}创建集合,用于存储已注册的用户名 - 通过按逗号拆分第一个输入字符串,获取现有用户名
- 使用空结构体字面量
{}作为值,将每个现有用户名添加到集合中 - 通过按逗号拆分第二个输入字符串,获取新的注册尝试
- 对于每次注册尝试,使用逗号 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. 列出所有已注册的用户名(记得排序,确保输出顺序一致)
}逻辑与流程中的所有课
自己练习: Go 在线编译器