命令行子命令 - Go by Example 中文版

文章推薦指數: 80 %
投票人數:10人

go 和 git 这种命令行工具,都有很多的子命令。

并且每个工具都有一套自己的flag,比如: go build 和 go get 是 go 里面的两个不同的子命令。

flag 包让我们可以轻松 ... GobyExample中文版:命令行子命令 go和git这种命令行工具,都有很多的子命令。

并且每个工具都有一套自己的flag,比如: gobuild和goget是go里面的两个不同的子命令。

flag包让我们可以轻松的为工具定义简单的子命令。

packagemain import( "flag" "fmt" "os" ) funcmain(){ 我们使用NewFlagSet函数声明一个子命令, 然后为这个子命令定义一个专用的flag。

fooCmd:=flag.NewFlagSet("foo",flag.ExitOnError) fooEnable:=fooCmd.Bool("enable",false,"enable") fooName:=fooCmd.String("name","","name") 对于不同的子命令,我们可以定义不同的flag。

barCmd:=flag.NewFlagSet("bar",flag.ExitOnError) barLevel:=barCmd.Int("level",0,"level") 子命令应作为程序的第一个参数传入。

iflen(os.Args)<2{ fmt.Println("expected'foo'or'bar'subcommands") os.Exit(1) } 检查哪一个子命令被调用了。

switchos.Args[1]{ 每个子命令,都会解析自己的flag并允许它访问后续的位置参数。

case"foo": fooCmd.Parse(os.Args[2:]) fmt.Println("subcommand'foo'") fmt.Println("enable:",*fooEnable) fmt.Println("name:",*fooName) fmt.Println("tail:",fooCmd.Args()) case"bar": barCmd.Parse(os.Args[2:]) fmt.Println("subcommand'bar'") fmt.Println("level:",*barLevel) fmt.Println("tail:",barCmd.Args()) default: fmt.Println("expected'foo'or'bar'subcommands") os.Exit(1) } } $gobuildcommand-line-subcommands.go 首先调用foo子命令。

$./command-line-subcommandsfoo-enable-name=joea1a2 subcommand'foo' enable:true name:joe tail:[a1a2] 然后试一下bar子命令。

$./command-line-subcommandsbar-level8a1 subcommand'bar' level:8 tail:[a1] 但是bar不接受foo的flag(enable)。

$./command-line-subcommandsbar-enablea1 flagprovidedbutnotdefined:-enable Usageofbar: -levelint level 接下来我们会学习程序获取参数的另一种常见方式——环境变量。

下一个例子:环境变量



請為這篇文章評分?