Menu
CoddyTech

简单数字验证器

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 67 课,共 68 课。

challenge icon

挑战

简单

创建一个数字验证系统,演示接口如何定义行为契约,以及验证失败时自定义错误如何提供有用的反馈。本挑战将检验你创建接口、使用自定义类型实现接口,以及妥善处理验证错误的能力。

你会收到两个输入:

  • 一个包含待验证数字的字符串,数字之间用逗号分隔(例如 "45,150,25,200,75")
  • 一个包含验证范围的字符串,格式为 "min:max"(例如 "1:100")

你的任务是:

  1. 定义一个 Validator 接口,其中包含一个方法:Validate() error
  2. 创建一个名为 ValidationError 的自定义错误类型结构体,包含两个字段:Value(int)和 Message(string)
  3. 为 ValidationError 实现 Error() string 方法,使其按以下格式返回消息:"Validation failed: [message] (value: [value])"
  4. 创建一个包含三个字段的 NumberValidator 结构体:Number(int)、Min(int)和 Max(int)
  5. 为 NumberValidator 实现 Validate() error 方法,使其:
    • 如果数字在有效范围内(包括边界值),则返回 nil
    • 如果数字小于最小值,则返回一条消息为 "number below minimum range" 的 ValidationError
    • 如果数字大于最大值,则返回一条消息为 "number above maximum range" 的 ValidationError
  6. 按逗号拆分第一个输入,获取各个数字字符串
  7. 按冒号拆分第二个输入,提取最小值和最大值
  8. 使用 strconv 包将所有字符串值转换为整数
  9. 显示验证标题:"=== NUMBER VALIDATION SYSTEM ==="
  10. 显示验证参数:"Validating numbers in range [min] to [max]"
  11. 对每个数字:
    • 创建一个 NumberValidator 实例,并传入数字和范围值
    • 调用验证器的 Validate() 方法
    • 如果验证通过(错误为 nil),则显示:"✓ [number] is valid"
    • 如果验证失败(错误不为 nil),则显示:"✗ [error_message]"
  12. 显示验证摘要:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. 显示完成消息:"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 在线编译器