工作中,经常需要开发一下命令行小工具,需要用到命令解析的功能,go flag 库可以快速的帮我们实现。
var (
intFlag int
boolFlag bool
stringFlag string
)
func initCommand() {
flag.BoolVar(&boolFlag, "boolFlag", false, "bool flag value")
flag.IntVar(&intFlag, "intFlag", 0, "int flag value")
flag.StringVar(&stringFlag, "stringFlag", "default", "string flag value")
}
func main() {
initCommand()
flag.Parse()
fmt.Println("bool flag:", boolFlag)
fmt.Println("int flag:", intFlag)
fmt.Println("string flag:", stringFlag)
}
flag.IntVar(&intFlag, "intFlag", 0, "int flag value")
表示以形如 -intFlag 10
格式解析一个 int
型参数。默认值为0, 解析出来的值等于 intFlag
命令行格式
支持3种命令行格式:
-flag 或者 --flag
-flag=x 或者 --flag=x
-flag x 或者 --flag x // 非布尔类型才支持这种方式
- 和 -- 都可以使用,对于flag库它们的作用是一样的。
不带参数,输出默认值:
# ./flag
bool flag: false
int flag: 0
string flag: default
字符串参数,需要使用""
# ./flag --stringFlag hello world
bool flag: false
int flag: 0
string flag: hello
# ./flag --stringFlag "hello world"
bool flag: false
int flag: 0
string flag: hello world
遇到第一个非选项参数(即不是以-
和--
开头的)或--
,解析停止
# ./flag -intFlag 10 -- -boolFlag true
bool flag: false
int flag: 10
string flag: default
# ./flag -intFlag 10 str -boolFlag true
bool flag: false
int flag: 10
string flag: default
flag 支持的参数类型
flag包支持的命令行参数类型有bool、int、int64、uint、uint64、float float64、string、duration。
flag参数 | 有效值 |
---|---|
flag.StringVar | 合法字符串 |
flag.IntVar | 1234、0664、0x1234等类型,也可以是负数。 |
浮点数flag | 合法浮点数。 |
flag.BoolVar | 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。 |
flag.DurationVar | 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m” 合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。 |
长短型
前面提到flag 库 -v 和 --v 是一样的。但有时我们希望支持
-v
和 --version
,我们可以如下实现:
flag.BoolVar(&versionFlag, "v", false, "version flag value")
flag.BoolVar(&versionLongFlag, "version", false, "long version flag value")
子命令
参考资料
1、https://zhuanlan.zhihu.com/p/93321906
2、https://zhuanlan.zhihu.com/p/102579462
网友评论