gocookbook
gocookbook copied to clipboard
Go语言flag库的基本用法
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")
声明了一个字符串型的flagword
,指定了它的默认值和简介。flag.String
函数返回一个字符串型的指针(不是字符串值)。 - 声明
numb
和fork
这两个flag的函数flag.Int
和flag.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