Go 命令行参数标记

命令行参数标记是为命令行程序指定选项参数的常用方法。例如,在命令wc -l中,-l就是一个命令行参数标记。

Go提供了flag包来支持基本的命令行标记解析。我们这里将要使用这个包提供的方法来实现带选项的命令行程序。

  1. package main
  2. import "flag"
  3. import "fmt"
  4. func main() {
  5. // 基础的标记声明适用于string,integer和bool型选项。
  6. // 这里我们定义了一个标记`word`,默认值为`foo`和一
  7. // 个简短的描述。`flag.String`函数返回一个字符串指
  8. // 针(而不是一个字符串值),我们下面将演示如何使
  9. // 用这个指针
  10. wordPtr := flag.String("word", "foo", "a string")
  11. // 这里定义了两个标记,一个`numb`,另一个是`fork`,
  12. // 使用和上面定义`word`标记相似的方法
  13. numbPtr := flag.Int("numb", 42, "an int")
  14. boolPtr := flag.Bool("fork", false, "a bool")
  15. // 你也可以程序中任意地方定义的变量来定义选项,只
  16. // 需要把该变量的地址传递给flag声明函数即可
  17. var svar string
  18. flag.StringVar(&svar, "svar", "bar", "a string var")
  19. // 当所有的flag声明完成后,使用`flag.Parse()`来分
  20. // 解命令行选项
  21. flag.Parse()
  22. // 这里我们仅仅输出解析后的选项和任何紧跟着的位置
  23. // 参数,注意我们需要使用`*wordPtr`的方式来获取最
  24. // 后的选项值
  25. fmt.Println("word:", *wordPtr)
  26. fmt.Println("numb:", *numbPtr)
  27. fmt.Println("fork:", *boolPtr)
  28. fmt.Println("svar:", svar)
  29. fmt.Println("tail:", flag.Args())
  30. }

为了运行示例,你需要先将程序编译为可执行文件。

  1. go build command-line-flags.go

下面分别看看给予该命令行程序不同选项参数的例子:

(1) 给所有的选项设置一个参数

  1. $ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
  2. word: opt
  3. numb: 7
  4. fork: true
  5. svar: flag
  6. tail: []

(2) 如果你不设置flag,那么它们自动采用默认的值

  1. $ ./command-line-flags -word=opt
  2. word: opt
  3. numb: 42
  4. fork: false
  5. svar: bar
  6. tail: []

(3) 尾部的位置参数可以出现在任意一个flag后面

  1. $ ./command-line-flags -word=opt a1 a2 a3
  2. word: opt
  3. numb: 42
  4. fork: false
  5. svar: bar
  6. tail: [a1 a2 a3]

(4) 注意flag包要求所有的flag都必须出现在尾部位置参数的前面,否则这些flag将被当作位置参数处理

  1. $ ./command-line-flags -word=opt a1 a2 a3 -numb=7
  2. word: opt
  3. numb: 42
  4. fork: false
  5. svar: bar
  6. trailing: [a1 a2 a3 -numb=7]

(5) 使用-h或者--help这两个flag来自动地生成命令行程序的帮助信息

  1. $ ./command-line-flags -h
  2. Usage of ./command-line-flags:
  3. -fork=false: a bool
  4. -numb=42: an int
  5. -svar="bar": a string var
  6. -word="foo": a string

(6) 如果你提供了一个程序不支持的flag,那么程序会打印一个错误信息和帮助信息

  1. $ ./command-line-flags -wat
  2. flag provided but not defined: -wat
  3. Usage of ./go_cmd_flag:
  4. -fork=false: a bool
  5. -numb=42: an int
  6. -svar="bar": a string var
  7. -word="foo": a string