简单数字验证器
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 67 课,共 68 课。
挑战
简单创建一个数字验证系统,演示接口如何定义行为契约,以及验证失败时自定义错误如何提供有用的反馈。本挑战将检验你创建接口、使用自定义类型实现接口,以及妥善处理验证错误的能力。
你会收到两个输入:
- 一个包含待验证数字的字符串,数字之间用逗号分隔(例如
"45,150,25,200,75") - 一个包含验证范围的字符串,格式为
"min:max"(例如"1:100")
你的任务是:
- 定义一个
Validator接口,其中包含一个方法:Validate() error - 创建一个名为
ValidationError的自定义错误类型结构体,包含两个字段:Value(int)和Message(string) - 为
ValidationError实现Error() string方法,使其按以下格式返回消息:"Validation failed: [message] (value: [value])" - 创建一个包含三个字段的
NumberValidator结构体:Number(int)、Min(int)和Max(int) - 为
NumberValidator实现Validate() error方法,使其:- 如果数字在有效范围内(包括边界值),则返回
nil - 如果数字小于最小值,则返回一条消息为
"number below minimum range"的ValidationError - 如果数字大于最大值,则返回一条消息为
"number above maximum range"的ValidationError
- 如果数字在有效范围内(包括边界值),则返回
- 按逗号拆分第一个输入,获取各个数字字符串
- 按冒号拆分第二个输入,提取最小值和最大值
- 使用
strconv包将所有字符串值转换为整数 - 显示验证标题:
"=== NUMBER VALIDATION SYSTEM ===" - 显示验证参数:
"Validating numbers in range [min] to [max]" - 对每个数字:
- 创建一个
NumberValidator实例,并传入数字和范围值 - 调用验证器的
Validate()方法 - 如果验证通过(错误为
nil),则显示:"✓ [number] is valid" - 如果验证失败(错误不为
nil),则显示:"✗ [error_message]"
- 创建一个
- 显示验证摘要:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- 显示完成消息:
"Number validation completed successfully"
使用 strings 包拆分输入字符串,使用 strconv 包将字符串转换为整数,并使用 fmt 包进行格式化输出。本挑战将演示如何使用接口创建灵活的验证系统,并通过自定义错误类型提供详细的错误信息。
亲手试试
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 读取输入
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// 解析输入
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// 将范围值转换为整数
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: 在下方编写你的代码
// 1. 定义 Validator 接口
// 2. 创建 ValidationError 结构体并实现 Error() 方法
// 3. 创建 NumberValidator 结构体并实现 Validate() 方法
// 4. 处理并验证每个数字
// 5. 显示结果和汇总信息
// 显示验证标题
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// 在这里处理每个数字
// 显示验证汇总信息
fmt.Println("=== VALIDATION SUMMARY ===")
// 在这里添加汇总输出
fmt.Println("Number validation completed successfully")
}逻辑与流程中的所有课
自己练习: Go 在线编译器