Go-flag包解析

2019-11-19  本文已影响0人  xyz098

简介

godoc-flag

标准库-命令行参数解析flag

cobra-解析命令

功能:flag实现命令行解析

# 用法
go run main.go -flag
go run main.go -flag=x
go run main.go -flag x  #bool类型的flag不能用,当x为false代表文件名将引起歧义。

使用

普通类型

// 两种用法
// 参数: flag名, 默认值, 说明
var city = flag.String("city", "xian", "your name")

// 参数: 变量, flag名, 默认值, 说明
var name string

func init() {
    flag.StringVar(&name, "name", "vera", "your name")
}

func main() {
    flag.Parse()
    fmt.Println(*city, name)
}

//  usage: go run main.go -city shanghai -name lina
// output: shanghai lina
自定义类型
// 自定义类型要实现接口Set()、String()方法
type interval []time.Duration

func (i *interval) String() string {
    return fmt.Sprint(*i)
}

func (i *interval) Set(value string) error {
    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
}

// 在init中调用flag.Var()实现
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)
}

//  usage: go run main.go -deltaT 10s,9s,8s
// output: [10s 9s 8s]
usage
func usage() {
    fmt.Fprintf(os.Stderr, `test: test/1.1.0
    Usage: test [-city]
Options:
`)
    flag.PrintDefaults()
}

var city = flag.String("city", "xian", "the city name")

func init() {
    // 重置默认的 Usage
    flag.Usage = usage
}

func main() { 
    flag.Parse()
    fmt.Println(*city)
}

//  usage: go run main.go -h 
/* output: 
test: test/1.1.0
        Usage: test [-city]
Options:
  -city string
        the city name (default "xian")
*/

源码

理解
分析

一个flag的数据结构

type Flag struct {
    Name     string // name as it appears on command line
    Usage    string // help message
    Value    Value  // value as set
    DefValue string // default value (as text); for usage message
}

接口灵活设定和打印不同类型数据

// set()    : 实现从命令行接收到对应flag时重新设置flag的值
// string() : 两个功能,一是程序启动时读默认值赋值,二是fmt.Println打印
//  Value接口类型
type Value interface {
    String() string
    Set(string) error
}
flag.String为例
上一篇下一篇

猜你喜欢

热点阅读