Go 的 flag 包可以解析命令行的参数。
一、命令行语法
命令行语法主要有以下几种形式:
cmd -flag // 只支持bool类型
cmd -flag=xxx
cmd -flag xxx // 只支持非bool类型
以上语法对于一个或两个‘-’号是一样的,即
cmd -flag xxx (使用空格,一个 - 符号)
cmd --flag xxx (使用空格,两个 - 符号)
cmd -flag=xxx (使用等号,一个 - 符号)
cmd --flag=xxx (使用等号,两个 - 符号)
对于整形 flag,合法的值可以为 1234,0664,0x1234 或 负数 等。对于布尔型 flag,可以为 1,0,t,f,T,F,true,false,TRUE,FALSE,True,False 等
其中,布尔类型的参数比较特殊,为了防止解析时的二义性,应该使用 等号 的方式指定
二、命令行参数方法
1. 定义flag参数
参数有三个:第一个为 参数名称,第二个为 默认值,第三个是 使用说明
1> 通过 flag.String(),Bool(),Int() 等 flag.Xxx() 方法,该种方式返回一个相应的指针
1
|
var
ip = flag.Int(
"flagname"
, 1234,
"help message for flagname"
)
|
2> 通过 flag.XxxVar() 方法将 flag 绑定到一个变量,该种方式返回 值类型,如
1
2
|
var
flagvar int
flag.IntVar(&flagvar,
"flagname"
, 1234,
"help message for flagname"
)
|
3> 通过 flag.Var() 绑定自定义类型,自定义类型需要实现 Value 接口 (Receiver 必须为指针),如
1
|
flag.Var(&flagVal,
"name"
,
"help message for flagname"
)
|
2. 调用 flag.Parse() 解析命令行参数到定义的 flag
1
|
flag.Parse()
|
解析函数将会在碰到第一个 非flag 命令行参数时停止,非flag 命令行参数是指不满足命令行语法的参数,如命令行参数为 cmd --flag=true abc 则第一个 非flag 命令行参数为“abc”
3. 调用 Parse 解析后,就可以直接使用 flag 本身(指针类型)或者绑定的变量了(值类型)
1
|
fmt.Println(
"flagvar has value "
, flagvar)
|
还可通过 flag.Args(), flag.Arg(i) 来获取 非flag 命令行参数!
三、实例
1
2
3
4
5
6
7
8
9
10
11
12
|
package
main
import
(
"flag"
"fmt"
)
func
main() {
username := flag.String(
"name"
,
""
,
"Input your username"
)
flag.Parse()
fmt.Println(
"Hello, "
, *username)
}
|
编译:
1
|
go
build flag.
go
|
运行:
1
|
./flag -name=world
|
输出:
1
|
Hello, world
|
Go 还允许 自定义“命令行参数解析规则”,如下接口所示:
FlagSet 结构:
1
2
3
|
type
FlagSet
struct
{
Usage
func
()
}
|
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package
main
import
(
"flag"
"fmt"
)
var
myFlagSet = flag.NewFlagSet(
"myflagset"
, flag.ExitOnError)
var
stringFlag = myFlagSet.String(
"abc"
,
"default value"
,
"help mesage"
)
func
main() {
myFlagSet.Parse([]string{
"-abc"
,
"def"
,
"ghi"
,
"123"
})
args := myFlagSet.Args()
for
i :=
range
args {
fmt.Println(i, myFlagSet.Arg(i))
}
}
|
- func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet
- func (f *FlagSet) Arg(i int) string
- func (f *FlagSet) Args() []string
- func (f *FlagSet) Bool(name string, value bool, usage string) *bool
- func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
- func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration
- func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string)
- func (f *FlagSet) Float64(name string, value float64, usage string) *float64
- func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string)
- func (f *FlagSet) Init(name string, errorHandling ErrorHandling)
- func (f *FlagSet) Int(name string, value int, usage string) *int
- func (f *FlagSet) Int64(name string, value int64, usage string) *int64
- func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string)
- func (f *FlagSet) IntVar(p *int, name string, value int, usage string)
- func (f *FlagSet) Lookup(name string) *Flag
- func (f *FlagSet) NArg() int
- func (f *FlagSet) NFlag() int
- func (f *FlagSet) Parse(arguments []string) error
- func (f *FlagSet) Parsed() bool
- func (f *FlagSet) PrintDefaults()
- func (f *FlagSet) Set(name, value string) error
- func (f *FlagSet) SetOutput(output io.Writer)
- func (f *FlagSet) String(name string, value string, usage string) *string
- func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
- func (f *FlagSet) Uint(name string, value uint, usage string) *uint
- func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64
- func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string)
- func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string)
- func (f *FlagSet) Var(value Value, name string, usage string)
- func (f *FlagSet) Visit(fn func(*Flag))
- func (f *FlagSet) VisitAll(fn func(*Flag))