Ôn tập: tên người dùng duy nhất
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 37 trên 68.
Thử thách
DễXây dựng hệ thống đăng ký tên người dùng để ngăn tên trùng lặp bằng cách dùng thành ngữ tập hợp của Go. Thử thách này minh họa cách tạo hệ thống quản lý người dùng mạnh mẽ, đảm bảo tên người dùng luôn duy nhất trong mọi lượt đăng ký.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa các tên người dùng hiện có, được phân tách bằng dấu phẩy (ví dụ:
"alice123,bob_dev,charlie2024,diana_codes") - Một chuỗi chứa các lần thử đăng ký tên người dùng mới, được phân tách bằng dấu phẩy (ví dụ:
"eve_user,alice123,frank_dev,bob_dev,grace2024,alice123")
Nhiệm vụ của bạn:
- Tạo một tập hợp bằng thành ngữ Go
map[string]struct{}để lưu tên người dùng đã đăng ký - Phân tích chuỗi đầu vào thứ nhất bằng cách tách chuỗi tại dấu phẩy để lấy các tên người dùng hiện có
- Thêm từng tên người dùng hiện có vào tập hợp bằng cách dùng giá trị struct rỗng
{} - Phân tích chuỗi đầu vào thứ hai bằng cách tách chuỗi tại dấu phẩy để lấy các lần thử đăng ký mới
- Với mỗi lần thử đăng ký, kiểm tra xem tên người dùng đã có trong tập hợp chưa bằng thành ngữ comma ok
- Hiển thị quá trình đăng ký cho từng lần thử:
- Nếu tên người dùng còn khả dụng:
"Registered: [username]"và thêm tên đó vào tập hợp - Nếu tên người dùng đã tồn tại:
"Username taken: [username]"
- Nếu tên người dùng còn khả dụng:
- Sau khi xử lý tất cả các lần thử đăng ký, hiển thị bản tóm tắt đầy đủ:
"Registration Summary:""Initial usernames: [initial_count]""Registration attempts: [attempts_count]""Successful registrations: [successful_count]""Rejected (duplicate): [rejected_count]""Total registered usernames: [total_count]"
- Cuối cùng, liệt kê tất cả tên người dùng đã đăng ký trong hệ thống:
- Dòng tiêu đề:
"All registered usernames:" - Mỗi tên người dùng trên một dòng riêng:
"@[username]"
- Dòng tiêu đề:
Dùng package strings để tách các chuỗi đầu vào tại dấu phẩy. Thử thách này minh họa cách thành ngữ tập hợp của Go giúp ngăn trùng lặp hiệu quả trong hệ thống đăng ký người dùng, đảm bảo tính toàn vẹn dữ liệu và cho phép tra cứu nhanh khi xác thực tên người dùng.
Tự làm thử
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
// Đọc đầu vào
var existingUsernames string
var newRegistrations string
fmt.Scanln(&existingUsernames)
fmt.Scanln(&newRegistrations)
// Phân tích các chuỗi đầu vào
existing := strings.Split(existingUsernames, ",")
attempts := strings.Split(newRegistrations, ",")
// Tạo tập hợp theo cách thông dụng trong Go
userSet := make(map[string]struct{})
// TODO: Viết code bên dưới
// 1. Thêm các tên người dùng hiện có vào tập hợp
// 2. Xử lý từng lần đăng ký
// 3. Hiển thị kết quả của từng lần đăng ký
// 4. Tính và hiển thị phần tổng kết
// 5. Liệt kê tất cả tên người dùng đã đăng ký (nhớ sắp xếp để đầu ra luôn nhất quán)
}Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành vi6Go theo cách viết thành ngữ: tập hợp
Cách dùng tập hợp trong GoTạo tập hợpThêm phần tử vào tập hợpKiểm tra phần tử có thuộc tập hợp khôngXóa phần tử khỏi tập hợpLặp qua tập hợpÔn tập: tên người dùng duy nhấtTự luyện tập: Trình biên dịch Go online