Go 命令行工具flag

使用标准库中的flag可以很快的写出一个简单的命令行工具。

先来一个简单的例子:

package main

import (
    "flag"
    "fmt"
)

func main() {
    arg1 := flag.Bool("bool", false, "bool value for test")
    arg2 := flag.Int("int", 100, "integer value for test")
    arg3 := flag.String("string", "str", "string value for test")

    flag.Parse()
    fmt.Println("bool:\t", *arg1)
    fmt.Println("int:\t", *arg2)
    fmt.Println("string:\t", *arg3)
}

输入输出:

$ go run src/cli.go -string hello -bool true -int 100 
bool:    true
int:     100
string:  hello
  • flag.Bool()flag.Int()flag.String()三个方法用途类似,都是指定命令参数的工具,包含三个参数,分别为:参数名、默认值、提示信息。

  • flag.Parse() 解析传入的参数并绑定在内存地址中

以上代码等同于:

func main() {
    var arg1 bool
    var arg2 int
    var arg3 string
    flag.BoolVar(&arg1, "bool", false, "bool value for test")
    flag.IntVar(&arg2, "int", 100, "integer value for test")
    flag.StringVar(&arg3,"string", "str", "string value for test")

    flag.Parse()
    fmt.Println("bool:\t", arg1)
    fmt.Println("int:\t", arg2)
    fmt.Println("string:\t", arg3)
}

还能自定义数据格式

package main

import (
    "strings"
    "flag"
    "fmt"
)

// 只要实现Set和String两个接口
type slice []string

func NewSlice(vals []string, p *[]string) *slice {
    *p = vals
    return (*slice)(p)
}

func (s *slice) Set(val string) error {
    *s = slice(strings.Split(val, ","))
    return nil
}

func (s *slice) Get() interface{} {
    return []string(*s)
}

func (s *slice) String() string {
    return strings.Join([]string(*s), ", ")
}

func main() {
    var languages []string
    // 引入自定义格式
    flag.Var(NewSlice([]string{}, &languages), "languages", "many languages")

    flag.Parse()
    fmt.Println(languages)
}

输入输出:

$ go run src/cli.go -languages="Golang,Python,Java"
[Golang Python Java]

Last updated

Was this helpful?