kingpin

功能比flag库强大,用法差不多。
相比flag库,最重要的一点就是支持不加"-"的调用。
比如一个命令行程序有三个函数分别为A,B,C,要实现根据命令行的输入运行不同的函数,如果用flag实现的话应该是下面这种使用方法:

1
2
3
./cli --method A
./cli --method B
./cli --method C

每次都需要输入"–method",然而用kingpin库实现的话就可以达到下面这种效果:

1
2
3
./cli A
./cli B
./cli C

节省了很多输入操作。
首先获取kingpin库

1
go get gopkg.in/alecthomas/kingpin.v2

然后在代码中

1
import "gopkg.in/alecthomas/kingpin.v2"

就可以开始使用了。官方文档在这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
import (
"os"
"strings"
"gopkg.in/alecthomas/kingpin.v2"
)
var (
app = kingpin.New("chat", "A command-line chat application.")
//bool类型参数,可以通过 --debug使该值为true
debug = app.Flag("debug", "Enable debug mode.").Bool()
//识别 ./cli register
register = app.Command("register", "Register a new user.")
// ./cli register之后的参数,可通过./cli register gggle 123456 传入name为gggle pwd为123456 参数类型为字符串
registerName = register.Arg("name", "Name for user.").Required().String()
registerPwd = register.Arg("pwd", "pwd of user.").Required().String()
//识别 ./cli post
post = app.Command("post", "Post a message to a channel.")
//可以通过 ./cli post --image file 或者 ./cli post -i file 传入文件
postImage = post.Flag("image", "Image to post.").Short('i').String()
//可以通过./cli post txt 传入字符串,有默认值"hello world"
postText = post.Arg("text", "Text to post.").Default("hello world").Strings()
)
func main() {
//从os接收参数传给kingpin处理
switch kingpin.MustParse(app.Parse(os.Args[1:])) {
case register.FullCommand():
println("name:" + *registerName)
println("pwd:" + *registerPwd)
case post.FullCommand():
println((*postImage))
text := strings.Join(*postText, " ")
println("Post:", text)
}
if *debug == true {
println("debug")
}
}

以上是一个简单的demo,根据注释也可以大概知道这个库的用法。
支持默认参数,可选参数,传参类型限定,其它各种用法可以在官方文档中找到详细的说明,golang各种库的说明文档还是写的很详细的。

Tip

如果Flag参数中以"-"开头的话,在传参的时候好像只能使用short参数名进行传参,而且需要参数紧贴参数名。
以上面的代码为例:

1
2
3
4
.\test.exe post -i'-123' //这样是可以的
.\test.exe post -i '-123' //出错
.\test.exe post --image '-123' //出错
.\test.exe post --image'-123' //出错