flag

编写命令行程序时会使用不同的启动参数(命令行参数)来控制程序的行为

Go编写命令行程序时,获取并解析命令行参数的方式:

  • 使用标准库osos.Args属性获取程序运行时给出的参数
  • 使用标准库 flag
  • 使用第三方库 urfave/clispf13/cobra

os.Args

  • Go标准库os可获取命令行参数,os.Args返回一个字符串数组,其中第一个参数是执行文件本身。
  • os.Args类型为[]string字符串切片,用于获取包括程序路径本身及其标记参数。
package os

var Args []string

例如:

for i,v :=  range os.Args {
    fmt.Printf("arg%d: %s\n", i+1, v)
}
$ go run main.go
arg1: C:\Users\junchow\AppData\Local\Temp\go-build732201822\b001\exe\main.exe

例如:获取除可执行文件本身的标记参数

fmt.Println(os.Args[1:])

flag

flag译为标记,这里的"标记"特指的是命令行选项参数。

  • Go标准库flag用于解析“命令行参数”,即运行程序提供的参数。
  • 相比通过os.Args字符串切片分析命令行参数,flag包提供了更强的解析命令行参数的能力。

使用flag包获取命令行参数一般分为两步骤,第一步定义待解析的参数,第二部是解析参数。

定义标记

使用flag包首先需要定义待解析的命令行参数,也就是命令行中以 -开头的参数。

定义待解析的命令行参数的三种方式

  • 调用flag.Xxx()方法获取对应类型的指针
func (f *FlagSet) Bool(name string, value bool, usage string) *bool
func (f *FlagSet) Int(name string, value int, usage string) *int
func (f *FlagSet) Int64(name string, value int64, usage string) *int64
func (f *FlagSet) Uint(name string, value uint, usage string) *uint
func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64
func (f *FlagSet) Float64(name string, value float64, usage string) *float64
func (f *FlagSet) String(name string, value string, usage string) *string
func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration
  • 调用flag.XxxVar()会将flag绑定到一个变量同时返回值类型
func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
func (f *FlagSet) IntVar(p *int, name string, value int, usage string)
func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string)
func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string)
func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string)
func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string)
func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string)
  • 绑定自定义类型的变量

调用flag.Var()方法绑定自定义类型,自定义类型需实现Value接口,Receives必须为指针。

func (f *FlagSet) Var(value Value, name string, usage string)

FlagSet

A FlagSet represents a set of defined flags

FlagSet是flag标记的集合,flag标记的使用过程分为三个步骤:

  1. 设置阶段:向FlagSet中摄入一条flag记录并返回指向flag所代表值的指针,flag记录包括名称、默认值、用法说明。
  2. 解析阶段:根据程序实际运行时的参数来覆盖默认值
  3. 使用阶段:根据设置阶段返回的指针来获取flag的值

flag.Xxx

func String(name string, value string, usage string) *string
参数类型描述
namestring标记名称
valuestring标记默认值
usagestring标记用法提示说明

例如:命令行执行go run main.go -h 127.0.0.1 -p 9800后获取-h-p的值

host := flag.String("h",  "0.0.0.0", "host")
port := flag.Int("p", 9200, "port")
flag.Parse()

fmt.Printf("%s:%d\n", *host, *port)
$ go run main.go
0.0.0.0:9200

$ go run main.go -h 127.0.0.1 -p 9800
127.0.0.1:9800

flag.XxxVar

func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
参数类型说明
p*string接收标记实际值的参数
namestring标记名称
valuestring标记默认值
usagestring标记用法提示信息

例如:命令行执行go run main.go -h 127.0.0.1 -p 9800后获取-h-p的值

var host string
var port int

flag.StringVar(&host, "h", "0.0.0.0", "host")
flag.IntVar(&port, "p", 9200, "port")

flag.Parse()
fmt.Printf("%s:%d\n", host, port)
$ go run main.go
0.0.0.0:9200

$ go run main.go -h 127.0.0.1 -p 9800
127.0.0.1:9800

解析标记

当标记定义完成后可通过flag.Parse()进行解析

命令行标记语法分为三种形式

$ cmd -flag // 只支持bool类型
$ cmd -flag x // 只支持非bool类型
$ cmd -flag = x
  • 以上语法对---效果一样
  • 对于bool布尔类型的参数,为防止解析时的二义性,应该使用等号=的方式指定。

flag.Parse

调用flag.Parse()解析命令行参数到定义的flagParse()解析函数会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数。

例如:第一个非flag命令行参数为abc

$ cmd --flag=true abc

flag.Args

  • flag.Args返回没有被解析的命令行参数
flag.Args()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值