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?