在golang中,我们可以使用flag
包内置的验证器来验证命令行参数。此外,我们还可以自定义验证函数来进行更复杂的参数检查。
以下是一个示例代码,演示如何使用内置验证器和自定义验证函数:
package main
import (
"flag"
"fmt"
"strconv"
)
func main() {
var age int
flag.IntVar(&age, "age", 0, "your age")
flag.Parse()
if age < 18 {
fmt.Println("You must be at least 18 years old.")
return
}
if age > 120 {
fmt.Println("Are you sure you're that old?")
return
}
fmt.Printf("You are %d years old.\n", age)
}
func validateRange(min, max int) func(string) error {
return func(val string) error {
n, err := strconv.Atoi(val)
if err != nil {
return fmt.Errorf("%s is not a valid number", val)
}
if n < min || n > max {
return fmt.Errorf("%d is out of range (%d-%d)", n, min, max)
}
return nil
}
}
在上面的代码中,我们首先定义了一个整型变量age
并绑定到了命令行参数-age
。然后调用了.Parse()
方法解析命令行参数。
接着,在主函数中添加了两个简单的检查:如果年龄小于18岁,则输出一条错误信息;如果年龄大于120岁,则输出另一条错误信息。这两个检查都是使用if
语句实现的,非常简单。
然后我们定义了一个名为validateRange
的函数,该函数接收两个整数作为参数,并返回一个新的验证函数。这个新函数会在给定范围之外时返回一个错误信息。
最后,在主函数中添加了一些自定义验证逻辑。我们将一个验证器传递给.Var()
方法来将其应用到命令行参数上。例如:
var age int
flag.Var(validateRange(18, 120), "age", "your age")
这里我们使用了.Var()
方法而不是.IntVar()
方法,因为我们需要自定义验证功能。同时我们也注意到,当传入的值无法转化为数字时会返回错误信息。
需要注意的是,在内置验证器和自定义验证器中都可以通过返回错误信息来表示检查失败。如果命令行参数不符合预期,则应输出错误信息并退出程序。