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

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

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


相关文章
|
21天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
21天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
2天前
|
Rust 安全 程序员
Rust vs Go:解析两者的独特特性和适用场景
在讨论 Rust 与 Go 两种编程语言哪种更优秀时,我们将探讨它们在性能、简易性、安全性、功能、规模和并发处理等方面的比较。同时,我们看看它们有什么共同点和根本的差异。现在就来看看这个友好而公平的对比。
|
1月前
|
机器学习/深度学习 编解码 API
FFmpeg命令行解析
FFmpeg命令行解析
68 1
|
1月前
|
存储 缓存 编译器
Go语言解析Tag:深入探究实现原理
【2月更文挑战第20天】
40 2
|
1月前
|
安全 Go 开发者
Go语言中的反射机制深度解析
【2月更文挑战第19天】Go语言的反射机制提供了一种在运行时检查对象类型、获取和设置对象字段、调用对象方法的能力。本文通过深入解析Go语言反射机制的核心概念、使用方法和注意事项,帮助读者更好地理解和应用这一强大而灵活的工具。
|
8天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
18 0
|
8天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
12 0
|
8天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
19 0
|
8天前
yolo-world 源码解析(五)(1)
yolo-world 源码解析(五)
31 0

推荐镜像

更多