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'    //出错