Trình kiểm tra số đơn giản
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 67 trên 68.
Thử thách
DễTạo một hệ thống kiểm tra số để minh họa cách các interface xác định hợp đồng hành vi, còn lỗi tùy chỉnh cung cấp phản hồi có ý nghĩa khi việc kiểm tra thất bại. Thử thách này sẽ kiểm tra khả năng tạo interface, triển khai chúng bằng các kiểu tùy chỉnh và xử lý lỗi kiểm tra phù hợp của bạn.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa các số cần kiểm tra, được phân tách bằng dấu phẩy (ví dụ:
"45,150,25,200,75") - Một chuỗi chứa phạm vi kiểm tra theo định dạng
"min:max"(ví dụ:"1:100")
Nhiệm vụ của bạn là:
- Định nghĩa một interface
Validatorvới một phương thức duy nhất:Validate() error - Tạo một kiểu lỗi tùy chỉnh có tên là struct
ValidationErrorvới hai trường:Value(int) vàMessage(string) - Triển khai phương thức
Error() stringchoValidationError, phương thức này trả về thông báo theo định dạng:"Validation failed: [message] (value: [value])" - Tạo một struct
NumberValidatorvới ba trường:Number(int),Min(int) vàMax(int) - Triển khai phương thức
Validate() errorchoNumberValidator>, phương thức này: <ul> <li>Trả về <code>nilnếu số nằm trong phạm vi hợp lệ, tính cả hai đầu mút - Trả về một
ValidationErrorvới thông báo"number below minimum range"nếu số nhỏ hơn giá trị tối thiểu - Trả về một
ValidationErrorvới thông báo"number above maximum range"nếu số lớn hơn giá trị tối đa - Phân tích đầu vào thứ nhất bằng cách tách tại dấu phẩy để lấy từng chuỗi số
- Phân tích đầu vào thứ hai bằng cách tách tại dấu hai chấm để lấy giá trị tối thiểu và tối đa
- Chuyển tất cả giá trị chuỗi thành số nguyên bằng package
strconv - Hiển thị tiêu đề kiểm tra:
"=== NUMBER VALIDATION SYSTEM ===" - Hiển thị các tham số kiểm tra:
"Validating numbers in range [min] to [max]" - Với mỗi số:
- Tạo một instance
NumberValidatorvới số đó và các giá trị phạm vi - Gọi phương thức
Validate()trên validator - Nếu kiểm tra thành công (lỗi là
nil), hiển thị:"✓ [number] is valid" - Nếu kiểm tra thất bại (lỗi không phải là
nil), hiển thị:"✗ [error_message]"
- Tạo một instance
- Hiển thị phần tổng kết kiểm tra:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- Hiển thị thông báo hoàn tất:
"Number validation completed successfully"
Dùng package strings để tách chuỗi đầu vào, package strconv để chuyển chuỗi thành số nguyên và package fmt để in dữ liệu theo định dạng. Thử thách này minh họa cách tạo các hệ thống kiểm tra linh hoạt bằng interface, đồng thời cung cấp thông tin lỗi chi tiết thông qua các kiểu lỗi tùy chỉnh.
Tự làm thử
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Đọc đầu vào
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// Phân tích các đầu vào
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// Chuyển các giá trị phạm vi thành số nguyên
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: Viết code của bạn bên dưới
// 1. Định nghĩa interface Validator
// 2. Tạo struct ValidationError và triển khai phương thức Error()
// 3. Tạo struct NumberValidator và triển khai phương thức Validate()
// 4. Xử lý và kiểm tra tính hợp lệ của từng số
// 5. Hiển thị kết quả và phần tổng kết
// Hiển thị tiêu đề kiểm tra tính hợp lệ
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// Xử lý từng số tại đây
// Hiển thị phần tổng kết kiểm tra tính hợp lệ
fmt.Println("=== VALIDATION SUMMARY ===")
// Thêm đầu ra tổng kết vào đây
fmt.Println("Number validation completed successfully")
}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 viTự luyện tập: Trình biên dịch Go online