Go flag包的基本使用
官网文档https://studygolang.com/pkgdoc
Go flag包的基本使用
flag包实现了命令行参数的解析。
导包:import "flag"
flag包支持的命令行参数类型有bool
、int
、int64
、uint
、uint64
、float
float64
、string
、duration
。
解析参数之前要先注册flag。常见两种用法:
用法一:
flag.Type(name, defValue, usage)
defValue:默认值
usage:用法,描述信息,爱写啥写啥
返回值是对应类型的指针
wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("num", 42, "an int")
boolPtr := flag.Bool("fork", false, "a bool")
timePtr := flag.Duration("d", 0, "时间间隔")
用法二:
flag.TypeVar(&flagvar, name, defValue, usage)
无返回值
var name string
var height int
var isGay bool
var t time.Duration
flag.StringVar(&name, "name", "dark", "姓名")
flag.IntVar(&height, "height", 176, "身高")
flag.BoolVar(&isGay, "Gay", false, "是否搞基")
flag.DurationVar(&t, "d", 0, "时间间隔")
不管是用哪种用法二,在注册flag后,都需要调用flag.Parse()
来对命令行参数进行解析。
命令行flag语法:
-flag
-flag=x
-flag x // 只有非bool类型的flag可以
可以使用1个或2个'-'号,效果是一样的。最后一种格式不能用于bool类型的flag,因为如果有文件名为0、false等时,如下命令:
cmd -x *
其含义会改变。你必须使用-flag=false格式来关闭一个bool类型flag。
Flag解析在第一个非flag参数(单个"-"不是flag参数)之前停止,或者在终止符"--"之后停止。
整数flag接受1234、0664、0x1234等类型,也可以是负数。bool类型flag可以是:
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
时间段flag接受任何合法的可提供给time.ParseDuration的输入。
flag参数 | 有效值 |
---|---|
字符串flag | 合法字符串 |
整数flag | 1234、0664、0x1234等类型,也可以是负数。 |
浮点数flag | 合法浮点数 |
bool类型flag | 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。 |
时间段flag | 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。 合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。 |
示例
package main
import (
"flag"
"fmt"
"time"
)
func main() {
wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("num", 42, "an int")
boolPtr := flag.Bool("fork", false, "a bool")
timePtr := flag.Duration("duration", 0, "时间间隔")
var name string
var height int
var isGay bool
var interval time.Duration
flag.StringVar(&name, "name", "dark", "姓名")
flag.IntVar(&height, "height", 176, "身高")
flag.BoolVar(&isGay, "Gay", false, "是否搞基")
flag.DurationVar(&interval, "interval", 1, "时间间隔")
//解析命令行参数
flag.Parse()
fmt.Println(*wordPtr, *numbPtr, *boolPtr, *timePtr)
fmt.Println(name, height, isGay, interval)
//返回命令行参数后的其他参数
fmt.Println(flag.Args())
//返回命令行参数后的其他参数个数
fmt.Println(flag.NArg())
//返回使用的命令行参数个数
fmt.Println(flag.NFlag())
}
使用:
PS C:\Users\Dark\GolandProjects\Mytest> go build
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe -help
Usage of C:\Users\Dark\GolandProjects\Mytest\Mytest.exe:
-Gay
是否搞基
-duration duration
时间间隔
-fork
a bool
-height int
身高 (default 176)
-interval duration
时间间隔 (default 1ns)
-name string
姓名 (default "dark")
-num int
an int (default 42)
-word string
a string (default "foo")
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe
foo 42 false 0s
dark 176 false 1ns
[]
0
0
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe -Gay=false -duration 300ms --fork=true --name Dark -num=1 --word=haha
haha 1 true 300ms
Dark 176 false 1ns
[]
0
6
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe -Gay=false -duration 300ms --fork=true --name Dark -num=1 --word=haha a b c d
haha 1 true 300ms
Dark 176 false 1ns
[a b c d]
4
6