go 命令参数的解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)
}

原创,转载请注明来自

猜你喜欢

转载自blog.csdn.net/wenzhou1219/article/details/88760135