Go flag/kingpin 命令行解析多个同名参数

  • Post author:
  • Post category:IT
  • Post comments:0评论

想了半天标题应该怎么写,都不太好表达,要的效果如下:

xx --name=aa --name=bb

需要解析出name参数,默认flag解析后返回的是最后一个值,即:bb

放出Google大法,搜出一篇早期文字:Issue 842041: Flags: add user-defined flag types

代码示例已经久远,直接拷贝代码运行会报错,原因是Set()应该返回error类型,而不是bool啦。

需要注意的是,如果想实现解析数组,需要:

  • 定义类型type xx
  • 类型xx实现String()和Set()函数

示例输出:

$ ./xx --name=xx -name=yy
v = [xx yy]

上面的示例是基于 Go 语言自带的flag模块,这个稍繁琐了点,我自己用了另外一个模块:alecthomas/kingpin

作者在源码values.go#L203里也有类似的封装,但是只有一个:Strings(注意末尾多了一个s)

同样也是实现了上述函数,另外还有一个:IsCumulative()

话不多说,还是上个示例:

package main

import (
        "fmt"
        "gopkg.in/alecthomas/kingpin.v1"
)

var (
        names = kingpin.Flag("name", "").Strings()
)

func main() {
        kingpin.Parse()
        fmt.Println(*names)
}

效果同上。

END

Go flag/kingpin 命令行解析多个同名参数was originally published by smallfish atsmallfish blogon January 17, 2015.

发表回复