版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wenzhou1219/article/details/88760135
命令参数的解析是常用功能,go中借助flag包来完成这一功能。
flag
flag使用很简单,包括如下3步:
- 预声明参数变量
- 绑定参数解析和调整帮助显示
- 参数解析,按照预定义方式绑定到变量
//预声明变量
var name string
//绑定参数变量
func init() {
flag.StringVar(&name, "name", "jim", "the name must be input")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of params:\n")
flag.PrintDefaults()
}
}
func main(){
//解析参数
flag.Parse()
fmt.Print(os.Args)
fmt.Print(name)
}
注意这里通过Usage指定–help参数对应的回显消息,输入错误时也会显示此消息。编译完成后,如下运行
go run parse.go -name=wenzhou --help
输出如下
Usage of params:
-name string
the name must be input (default "jim")
自定义flag
上述flag解析中,发生错误时会自动退出显示Usage信息,如果我想它抛出一个异常呢?这就需要了解flag的构成,参考源码,看到如下结构,可以知道其实flag中解析的工作都是由CommandLine来完成的。
...
func StringVar(p *string, name string, value string, usage string) {
CommandLine.Var(newStringValue(value, p), name, usage)
}
...
func Parse() {
// Ignore errors; CommandLine is set for ExitOnError.
CommandLine.Parse(os.Args[1:])
}
...
var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
func init() {
CommandLine.Usage = commandLineUsage
}
可以看到默认CommandLine声明ExitOnError即为错误时推出,如下我们可以自己创建CommandLine,指定PanicOnError即为错误时抛出异常。
var name1 string
func init() {
flag.CommandLine = flag.NewFlagSet("", flag.PanicOnError)
flag.CommandLine.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of params:\n")
flag.PrintDefaults()
}
flag.StringVar(&name1, "name", "wenwen", "the name must be input")
}
func main(){
flag.Parse()
fmt.Println(name1)
}
完全自定义解析
既然如上源码看到参数解析通过NewFlagSet来完成,那我们完全可以自己处理解析,如下:
func main(){
var cmdl = flag.NewFlagSet("", flag.ExitOnError)
cmdl.StringVar(&name2, "name", "jim", "name must be input")
//cmdl.Usage = func() {
// fmt.Fprintf(os.Stderr, "Usage of params:\n")
// cmdl.PrintDefaults()
//}
cmdl.Parse(os.Args[1:])
fmt.Println(name2)
}
原创,转载请注明来自