kevinyan815/gocookbook

Go语言flag库的基本用法

kevinyan815 opened this issue · 0 comments

Go语言提供的flag库支持基础的命令行flag的解析。什么是命令行flag? 举个例子来说,常用的Linux命令wc -l这个-l就是wc命令支持的一个命令行flag。

下面是用Go语言的flag包编写的一个命令行Demo程序:

package main

import (
    "flag"
    "fmt"
)

func main() {

    wordPtr := flag.String("word", "Jude", "a string")

    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    flag.Parse()

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

使用flag包可以为程序声明字符串型、数字型、布尔型的命令行flag。

  • flag.String("word", "Jude", "a string")声明了一个字符串型的flag word,指定了它的默认值和简介。flag.String函数返回一个字符串型的指针(不是字符串值)。
  • 声明numbfork这两个flag的函数flag.Intflag.Bool,使用方法跟flag.String函数的一样。
  • flag.StringVar(&svar, "svar", "bar", "a string var")这个形式的函数可以把命令行flag参数值解析到程序中的已存变量,需要注意的是函数接受的是已存变量的指针。
  • 定义完所有的命令行flag后,调用flag.Parse()函数去执行命令行解析。
  • 上面的程序只是打印出了所有命令行flag的值以及位置参数的值。注意我们需要对wordPtr这几个存储了指针的变量进行解引用(*wordPtr)才能拿到具体的命令行flag值。

要使用制作的命令行程序,先把程序编译成二进制命令文件:

go build -o {目标目录}/go-cli-flags  {源文件目录}/{源文件.go}

执行命令时为每个flag指定值:

$ ./go-cli-flags -word=opt -numb=7 -fork -svar=flag

// 下面是命令执行后的输出
word: opt
numb: 7
fork: true
svar: flag
tail: []

执行命令时被忽略的flag会自动使用定义flag时指定的默认值。

$ ./go-cli-flags -word=opt

word: opt
numb: 42
fork: false
svar: bar
tail: []

执行命令时,在flag后可以传递任意多个位置实参

$ ./go-cli-flags -word=opt a1 a2 a3
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3]

注意,flag包要求执行命令时所有命令行flag参数都要出现在位置实参的前面,否则命令行flag参数将会被理解成位置实参,比如下面这样

$ ./go-cli-flags -word=opt a1 a2 a3 -numb=7

word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

使用-h或者--help可以获取自动为命令行程序生成的帮助文本

$ ./go-cli-flags  -h
Usage of ./go-cli-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

如果在执行程序时提供了程序未指定的flag,程序会报告错误信息并展示帮助文本。

$ ./go-cli-flags -wat
flag provided but not defined: -wat
Usage of ./go-cli-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

更多用flag库编写CLI程序的例子:https://www.digitalocean.com/community/tutorials/how-to-use-the-flag-package-in-go