如何使用go做命令行flag解析

莫世威 · · 720 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Using Command Line Flags in Go

Go有很多方式去处理CLIflags,第一种方式就是不适用任何库,使用os.Args检测。第二种方式是去使用标准库flag,第三种方式就是使用众多第三方CLI库之一,比如Cobra。

这次的内容主要讨论第二种方式,使用标准库flag,因为它在os.Args之上提供了诸多未处理的语法分析的便利,它还是内建的。在使用前 import "flag"

接受一个int类型参数:

func Int(name string, value int, usage string) *int

var count = flag.Int("count", 5, "the count of items")
fmt.Println("count value ", *count)

第一个参数是flag名字当使用在CLI中,第二个参数是默认值,第三个对于该参数的描述

flag.IntVar()提供了一种可以替换的语法

func IntVar(p *int, name string, value int, usage string)

var count int
flag.IntVar(&count, "count", 5, "the count of items")
fmt.Println("count value ", count)

这里参数发生了变化,第一个参数变成了变量的引用
两者主要的差别就是第一个用例中你得到的是一个指针,第二个用例你得到的是一个值
flag提供了许多方法去分析不同的flag类型,你可以用他们处理每一种你想接受的类型。

func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func IntVar(p *int, name string, value int, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func UintVar(p *uint, name string, value uint, usage string)

传递错误的数据类型会引发error,暂停程序,还会将所需的用法打印给用户。

如何去设置flag?

只需要将- flagname加入到CLI命令中,有四种等效的语法:

-count=x
-count x
--count=x
--count x

你可以向命令传递任意数量的flag,但是如果flag包认不出你传递的flag它也会对停止对其它flag的解析,这意味着如果你还有其他非flag的参数,一定要在开始时,先使用所有的flag参数,避免flag包停止解析。

解析flags:

在你定义好所有的flags之后,你需要去调用

flag.Parse()

这样才能真正的解析他们

Boolean flags

Boolean flags设置的方法很简单,只需要加-count,这会让boollean flag得到true的值,如果设置false的值,可以使用-count=false。下面的值用于设置boolean flags都是有效的:

1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False.

在实际生产环境中,许多时候经常会看到CIL应用接受一个带有描述性名称的标志,以及同一个带有字母缩写的标志,你可以通过提供两个handler来实现:
var gopherType string

func init() {
    const (
        defaultGopher = "pocket"
        usage         = "the variety of gopher"
    )
    flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
    flag.StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)")
}

what's next?

下一步还能做什么,你可以更深层次的去研究下去,像别的CLI命令那样,开发一些子命令,甚至还可以开发一个简单的CLI工具通过Go语言。

reference


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:莫世威

查看原文:如何使用go做命令行flag解析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

720 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传