Goflag教程展示了如何使用flagpackage解析Golang中的命令行参数。
flag
包实现命令行标志解析。命令行参数在os.Args
切片中可用。flag
包允许它们更灵活。
此外,还有第三方软件包,例如具有额外功能的Cobra。
func String(name string, value string, usage string) *string func StringVar(p *string, name string, value string, usage string)
flag
包包含多个用于解析不同标志类型的函数。每种标志类型都有两种选择。不同之处在于第一个返回指向变量的指针,另一个接受指向变量的指针。
使用flag.Args
,我们可以解析非标志参数;这些必须跟在标志参数之后。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
Go标志语法
有几种写标志的选项。
-count=x -count x --count=x --count x
这些适用于除布尔值之外的所有类型。
-upper --upper -upper=value --upper=value
布尔标志有这些选项。
Go标志简单示例
下面的例子是一个解析整数参数的简单程序。
package main import ( "flag" "fmt" ) func main() { num := flag.Int("n", 5, "# of iterations") flag.Parse() n := *num i := 0 for i < n { fmt.Println("falcon") i++ } }
程序打印单词“falcon”n次;n值是从命令行参数中解析出来的。
import ( "flag" "fmt" )
首先,我们导入flag
包。
num := flag.Int("n", 5, "# of iterations")
我们用flag.Int
注册了一个int标志。第一个参数是标志的名称,第二个是默认值,第三个是标志的描述。
flag.Parse()
我们使用flat.Parse
处理标志。
n := *num
因为我们使用了一个返回变量指针的函数,所以我们取消引用指针并获取值。
for i < n { fmt.Println("falcon") i++ }
我们打印了n次“falcon”这个词。
$ go run simple.go falcon falcon falcon falcon falcon $ go run simple.go -n 3 falcon falcon falcon
Goflag.String&flag.Int
flag.String
定义了一个带有指定名称、默认值和用法字符串的字符串标志。返回值是存储标志值的字符串变量的地址。flag.Int
定义了一个具有指定名称、默认值和用法字符串的int标志。返回值是存储标志值的int变量的地址。
package main import ( "flag" "fmt" ) var ( env *string port *int ) func init() { env = flag.String("env", "development", "current environment") port = flag.Int("port", 3000, "port number") } func main() { flag.Parse() fmt.Println("env:", *env) fmt.Println("port:", *port) }
该程序使用两个标志:环境选项和端口号。
func init() { env = flag.String("env", "development", "current environment") port = flag.Int("port", 3000, "port number") }
我们可以将语句放在init
函数中,该函数通常用于初始化状态变量。
$ go run string_int.go env: development port: 3000 $ go run string_int.go -port 8080 env: development port: 8080
Goflag.StringVar
flag.StringVar
定义了一个带有指定名称、默认值和用法字符串的字符串标志。第一个参数指向一个字符串变量,用于存储标志的值。
package main import ( "flag" "fmt" ) func main() { var name string flag.StringVar(&name, "name", "guest", "your name") flag.Parse() fmt.Printf("Hello %s\n", name) }
该示例从命令行获取用户名。
$ go run stringvar.go Hello guest $ go run stringvar.go -name Peter Hello Peter
Goflag.PrintDefaults
集合中所有定义的命令行标志的flag.PrintDefaults
默认值。
package main import ( "flag" "fmt" "os" ) func main() { var name string flag.StringVar(&name, "name", "", "your name") flag.Parse() if len(name) == 0 { fmt.Println("Usage: defaults.go -name") flag.PrintDefaults() os.Exit(1) } fmt.Printf("Hello %s\n", name) }
程序注册了name
标志并且make是必需的。
if len(name) == 0 { fmt.Println("Usage: defaults.go -name") flag.PrintDefaults() os.Exit(1) }
如果name变量为空,我们打印程序的用法。
$ go run defaults.go Usage: defaults.go -name -name string your name exit status 1
去标志.BoolVar
flag.BoolVar
定义了一个带有特定名称、默认值和用法字符串的bool标志。第一个参数指向一个bool变量,用于存储标志的值。
package main import ( "flag" "fmt" "strings" ) func main() { var name string var upper bool flag.StringVar(&name, "name", "guest", "your name") flag.BoolVar(&upper, "u", false, "display in uppercase") flag.Parse() var msg string msg = fmt.Sprintf("Hello %s", name) if upper { fmt.Println(strings.ToUpper(msg)) } else { fmt.Println(msg) } }
该程序采用用户名和是否以大写形式写入消息的布尔标志。
$ go run boolean.go -name Peter Hello Peter $ go run boolean.go -name Peter -u HELLO PETER
Goflag.Args
标志后面的参数可用作切片flag.Args
或单独用作flag.Arg(i)
。参数从0到flag.NArg()-1
进行索引。
package main import ( "flag" "fmt" "os" "strings" ) func main() { var u bool flag.BoolVar(&u, "u", false, "display in uppercase") flag.Parse() values := flag.Args() if len(values) == 0 { fmt.Println("Usage: nonflags.go [-u] words ...") flag.PrintDefaults() os.Exit(1) } for _, word := range values { if u { fmt.Println(strings.ToUpper(word)) } else { fmt.Println(word) } } }
程序有u
标志,它以大写形式打印标志后面的所有单词。
flag.BoolVar(&u, "u", false, "display in uppercase")
我们定义布尔标志。
values := flag.Args()
我们从终端获取所有的单词。
for _, word := range values { if u { fmt.Println(strings.ToUpper(word)) } else { fmt.Println(word) } }
我们遍历切片并打印单词;如果我们设置了大写标志,则单词将以大写形式打印。
$ go run nonflags.go sky blue falcon cup ocean sky blue falcon cup ocean $ go run nonflags.go -u sky blue falcon cup ocean SKY BLUE FALCON CUP OCEAN
在本教程中,我们使用标志包解析了Golang中的命令行参数。
列出所有Go教程。