import "flag"
git
flag包实现了命令行参数的解析。每一个参数认为一条记录,根据实际进行定义,到一个set集合。每条都有各自的状态参数。github
在使用flag时正常流程: golang
1. 经过flag.String(), flag.Bool(), flag.Int()等函数来定义命令行中须要使用的参数。
函数
2. 在定义完flag后,经过调用flag.Parse()来进行对命令行参数的解析。
ui
3. 获取flag.String(), flag.Bool(), flag.Int()等方法的返回值,即对应用户输入的参数.
spa
注意的是flag.Xxx()返回的值是变量的内存地址,要获取值时要经过在变量前加*(星号)获取.
命令行
说明:
像flag.Int、flag.Bool、flag.String这样的函数格式都是同样的,调用的时候须要传入3个参数
参数的说明以下:
第一个arg表示参数名称,在控制台的时候,提供给用户使用.
第二个arg表示默认值,若是用户在控制台没有给该参数赋值的话,就会使用该默认值.
第三个arg表示使用说明和描述,在控制台中输入-arg的时候会显示该说明,相似-help
可注册flag类型有:Bool / Int / Int64 / Uint / Uint64 / Float / Float64 / String / Duration / Var3d
type Flag struct { Name string // flag在命令行中的名字 Usage string // 帮助信息 Value Value // 要设置的值 DefValue string // 默认值(文本格式),用于使用信息 }
Flag类型表明一条flag的状态。指针
type FlagSet struct { // Usage函数在解析flag出现错误时会被调用 // 该字段为一个函数(而非采用方法),以便修改成自定义的错误处理函数 Usage func() // 内含隐藏或非导出字段 }
FlagSet表明一个已注册的flag的集合。FlagSet零值没有名字,采用ContinueOnError错误处理策略。code
func Int(name string, value int, usage string) *int
Int用指定的名称、默认值、提示信息注册一个int类型flag。返回一个保存了该flag的值的指针。
func IntVar(p *int, name string, value int, usage string)
IntVar用指定的名称、默认值、使用信息注册一个int类型flag,并将flag的值保存到p指向的变量。
func Parse()
从os.Args[1:]中解析注册的flag。必须在全部flag都注册好而未访问其值时执行。未注册却使用flag -help时,会返回ErrHelp。
即:将输入的flag和注册的flag进行匹配解析
func Parsed() bool
返回是否Parse已经被调用过。
package main import ( "flag" "fmt" ) func main() { married := flag.Bool("married", false, "Are you married?") age := flag.Int("age", 22, "How old are you?") name := flag.String("name", "", "What your name?") var address string //flag.StringVar这样的函数第一个参数换成了变量地址,后面的参数和flag.String是同样的。 flag.StringVar(&address, "address", "GuangZhou", "Where is your address?") flag.Parse() //解析输入的参数 fmt.Println("输出的参数married的值是:", *married)//不加*号的话,输出的是内存地址 fmt.Println("输出的参数age的值是:", *age) fmt.Println("输出的参数name的值是:", *name) fmt.Println("输出的参数address的值是:", address) }
从运行结果中能够看出,address参数咱们并无指定值,则输出的就是默认值. 另外,-arg后面的=号也不是必须的,能够用空格代替. 若是要查看该程序的全部参数的使用,可使用-help来查看,以下:
func PrintDefaults()
PrintDefault会向标准错误输出写入全部注册好的flag的默认值。
func NFlag() int
NFlag返回已被设置的flag的数量。
func Lookup(name string) *Flag
返回已经已注册flag的Flag结构体指针;若是flag不存在的话,返回nil。
func NArg() int
NArg返回解析flag以后剩余参数的个数。
func Args() []string
返回解析以后剩下的非flag参数。(不包括命令名).就是没法进行flag匹配的有哪些,
func Arg(i int) string
返回解析以后剩下的第i个参数,从0开始索引。
func Var(value Value, name string, usage string)
Var方法使用指定的名字、使用信息注册一个flag。该flag的类型和值由第一个参数表示,该参数应实现了Value接口。例如,用户能够建立一个flag,能够用Value接口的Set方法将逗号分隔的字符串转化为字符串切片。
func Set(name, value string) error
设置已注册的flag的值,修改或者设置
func Visit(fn func(*Flag))
按照字典顺序遍历标签,而且对每一个标签调用fn。 这个函数只遍历解析时进行了设置的标签。[就是执行时提供非默认的值]
func VisitAll(fn func(*Flag))
按照字典顺序遍历标签,而且对每一个标签调用fn。 这个函数会遍历全部标签,无论解析时有无进行设置。
package main import ( "flag" "fmt" ) func main() { // golang的flag包的一些基本使用方法 // 待使用的变量 var id int var name string var male bool // 是否已经解析 fmt.Println("parsed? = ", flag.Parsed()) // 设置flag参数 (变量指针,参数名,默认值,帮助信息) // 也能够用如下带返回值的方法代替,不过他们返回的是指针,比较麻烦点 // Int(name string, value int, usage string) *int // String(name string, value string, usage string) *string // Bool(name string, value bool, usage string) *bool flag.IntVar(&id, "id", 123, "help msg for id") flag.StringVar(&name, "name", "default name", "help msg for name") flag.BoolVar(&male, "male", false, "help msg for male") // 解析 flag.Parse() // 是否已经解析 fmt.Println("parsed? = ", flag.Parsed()) // // 获取非flag参数 fmt.Println(flag.NArg()) fmt.Println("------ Args start ------") fmt.Println(flag.Args()) for i, v := range flag.Args() { fmt.Printf("arg[%d] = (%s).\n", i, v) } fmt.Println("------ Args end ------") // // visit只包含已经设置了的flag fmt.Println("------ visit flag start ------") flag.Visit(func(f *flag.Flag) { fmt.Println(f.Name, f.Value, f.Usage, f.DefValue) }) fmt.Println("------ visit flag end ------") // // visitAll只包含全部的flag(包括未设置的) fmt.Println("------ visitAll flag start ------") flag.VisitAll(func(f *flag.Flag) { fmt.Println(f.Name, f.Value, f.Usage, f.DefValue) }) fmt.Println("------ visitAll flag end ------") // // flag参数 fmt.Printf("id = %d\n", id) fmt.Printf("name = %s\n", name) fmt.Printf("male = %t\n", male) // flag参数默认值 fmt.Println("------ PrintDefaults start ------") flag.PrintDefaults() fmt.Println("------ PrintDefaults end ------") //非flag参数个数 fmt.Printf("NArg = %d\n", flag.NArg()) // 已设置的flag参数个数 fmt.Printf("NFlag = %d\n", flag.NFlag()) }
# go run demo2_flag.go -id 234 -name "xx" -male=true p1 p2 p3 parsed? = false parsed? = true 3 ------ Args start ------ [p1 p2 p3] arg[0] = (p1). arg[1] = (p2). arg[2] = (p3). ------ Args end ------ ------ visit flag start ------ id 234 help msg for id 123 male true help msg for male false name xx help msg for name default name ------ visit flag end ------ ------ visitAll flag start ------ id 234 help msg for id 123 male true help msg for male false name xx help msg for name default name ------ visitAll flag end ------ id = 234 name = xx male = true ------ PrintDefaults start ------ -id int help msg for id (default 123) -male help msg for male -name string help msg for name (default "default name") ------ PrintDefaults end ------ NArg = 3 NFlag = 3
在flag包中,进行了进一步封装:将FlagSet的方法都从新定义了一遍,也就是提供了一序列函数,而函数中只是简单的调用已经实例化好了的FlagSet