flag 包实现命令行标志解析
用法:
使用 flag.String(), Bool(), Int() 等等定义标志
这声明一个整型标志,-flagname, 存储在指针 ip中,类型为 *int
import "flag"
var ip = flag.Int("flagname", 1234, "help message for flagname")
如果你喜欢,你可以绑定标志到一个变量上,使用 Var()
函数
var flagvar int
func init() {
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
}
或者您可以创建满足Value接口(带指针接收器)的自定义标志,并将它们耦合到标记解析。自己需要定义变量类型,并实现 Value 的接口
flag.Var(&flagVal, "name", "help message for flagname")
对于这样的 flags ,默认值就是该变量的初始值
在所有 flags 被定义后,调用:
flag.Parse()
解析命令行到定义的 flag 中。
标志或许在后面直接被使用,如果你使用标志本身,他们都是指针;如果你绑定到变量,它们都是值。
fmt.Println("ip has value ", *ip)
fmt.Println("falgVar has value ", flagvar)
在解析后,位于标志之后的参数可以通过 flag.Args() 参数访问或通过 flag.Args(i) 分别访问,参数索引从0开始,以 flag.NArg()-1结束。
完整示例(官方示例):
package main
import (
"flag"
"fmt"
"strings"
)
var name = flag.String("name", "张三", "学生的姓名")
var major string
func init() {
const (
defaultMajor = "计算机"
usage = "学生的专业"
)
flag.StringVar(&major, "major", defaultMajor, usage)
flag.StringVar(&major, "m", defaultMajor, usage+" (简写)")
}
type Classmates []string
func (i *Classmates) String() string {
return fmt.Sprint(*i)
}
func (i *Classmates) Set(value string) error {
for _, dt := range strings.Split(value, ",") {
*i = append(*i, dt)
}
return nil
}
var mates Classmates
func init() {
flag.Var(&mates, "class", "逗号分隔的同学列表")
}
func main() {
flag.Parse()
fmt.Println("name ", *name)
fmt.Println("major ", major)
fmt.Println("classmates ", mates)
}
运行结果如下:
➜ person go build myflag.go
➜ person ./myflag -h
Usage of ./myflag:
-class value
逗号分隔的同学列表
-m string
学生的专业 (简写) (default "网络")
-major string
学生的专业 (default "网络")
-name string
学生的姓名 (default "张三")
➜ person
➜ person ./myflag -class 李四,王五,赵六 -m 数学 -name 王二小
name 王二小
major 数学
classmates [李四,王五,赵六]
➜ person
➜ person ./myflag --class 李四,王五,赵六 --major=数学 -name=王二小
name 王二小
major 数学
classmates [李四,王五,赵六]
➜ person
命令行标志语法
下列的样式是允许的:
-flag
-flag=x
--flag x // 仅允许非布尔标志
--flag=x
一个或两个 “-” 可以被使用,它们是等效的。下面的那个样式不可以使用布尔标志,因为下面命令的意义
cmd -x *
此处的 *
是一个Unix shell 的通配符,如果有一个名为0,false等的文件,则会更改。您必须使用-flag = false表单来关闭布尔标志。
标志解析在第一个非标志处前停止("-" 是一 个非标志参数)或终止符“ - ”之后停止。 整数标志接受1234,0664,0121234并且可以是负数。布尔标志可能是:
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
持续时间标志接受对time.ParseDuration有效的任何输入
默认的命令行标志集由顶级函数控制。 FlagSet类型允许定义独立的标志集,例如在命令行界面中实现子命令。FlagSet的方法类似于命令行标志集的顶级函数。