golang学习笔记 --flag

概述

flag包提供了一系列解析命令行参数的功能接口git

命令行语法

命令行语法主要有如下几种形式github

-flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 

以上语法对于一个或两个‘-’号,效果是同样的,可是要注意对于第三种状况,只支持非bool类型,缘由是碰到以下状况时ruby

cmd -x * 

*为0,false有可能表示一个文件名或文件,也有可能表示x标签的值为0或false,会产生二义性,所以规定第三种只支持非bool类型。对于整形flag,合法的值能够为12340664,0x1234或负数等。对于布尔型flag,能够为10tfTF,truefalseTRUEFALSETrueFalseapp

命令行参数解析方法

使用flag主要包括如下几步函数

  1. 定义flag参数,有三种方式ui

    • 经过flag.String(), Bool(), Int() 等flag.Xxx()方法,该种方式返回一个相应的指针spa

      import "flag" var ip = flag.Int("flagname", 1234, "help message for flagname") 
    • 经过flag.XxxVar()方法将flag绑定到一个变量,该种方式返回值类型,如命令行

      var flagvar int func init() { flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") } 
    • 经过flag.Var()绑定自定义类型,自定义类型须要实现Value接口(Receives必须为指针),如指针

      flag.Var(&flagVal, "name", "help message for flagname") 

      对于这种类型的flag,默认值为该变量类型的初始值code

  2. 调用flag.Parse()解析命令行参数到定义的flag

    flag.Parse()

    解析函数将会在碰到第一个非flag命令行参数时中止,非flag命令行参数是指不知足命令行语法的参数,如命令行参数为cmd --flag=true abc则第一个非flag命令行参数为“abc”

  3. 调用Parse解析后,就能够直接使用flag自己(指针类型)或者绑定的变量了(值类型)

    fmt.Println("ip has value ", *ip) fmt.Println("flagvar has value ", flagvar) 

    还可经过flag.Args()flag.Arg(i)来获取非flag命令行参数

  4. 若是须要每一个函数的详细demo,可参见Gopkg:flag

示例

  • 示例1: 获取“species” flag的值,默认为“gopher”

    var species = flag.String("species", "gopher", "the species we are studying") 
  • 示例2: 两个flag共享同一个变量,通常用于同时实现完整flag参数和对应简化版flag参数,须要注意初始化顺序和默认值

    var gopherType string func init() { const ( defaultGopher = "pocket" usage = "the variety of gopher" ) flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage) flag.StringVar(&gopherType, "g", defaultGopher, usage+"(shorthand)") } 
  • 示例3: 将flag绑定用户自定义类型。按咱们先前所说,只须要实现Value接口,但实际上,若是须要取值的话,须要实现Getter接口,看下接口定义就明白了:

    type Getter interface { Value Get(string) interface{} } type Value interface { String() string Set(string) error } 

    接下来,咱们实现一个解析并格式化命令行输入的时间集合的例子,以下

    package main import ( "errors" "flag" "fmt" "strings" "time" ) type interval []time.Duration //实现String接口 func (i *interval) String() string { return fmt.Sprintf("%v", *i) } //实现Set接口,Set接口决定了如何解析flag的值 func (i *interval) Set(value string) error { //此处决定命令行是否能够设置屡次-deltaT if len(*i) > 0 { return errors.New("interval flag already set") } for _, dt := range strings.Split(value, ",") { duration, err := time.ParseDuration(dt) if err != nil { return err } *i = append(*i, duration) } return nil } var intervalFlag interval func init() { flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events") } func main() { flag.Parse() fmt.Println(intervalFlag) } 

    运行结果:

    //./commandLine -deltaT 61m,72h,80s [1h1m0s 72h0m0s 1m20s]
相关文章
相关标签/搜索