golang常用库之-命令行参数解析spf13/pflag包 | 标准库 flag包

golang常用库之-命令行参数解析spf13/pflag包 | 标准库 flag包

一、标准库 flag包

在Go程序编译好就是一个二进制文件,我们希望通过不同的参数来执行不同的操作,官方就提供了一个flag包,来实现这个功能。

使用思路: 定义变量,注册falg -> flag.Parse 解析,并赋值变量 -> 就可以通过变量值判断执行对应的操作

定义变量,注册flag

直接通过函数定义并赋值给变量(这里返回的是一个指针变量,取值的时候记得加&)

var number = flag.Int("n", 0, "get number from args")

第一个参数是命令行参数名称,第二个是默认值,第三个是参数提示内容

也可以先声明变量,然后再对变量进行注册

var number int
func init() {
	flag.IntVar(&number, "n", 0,"get number from args")
}

第一个参数是变量指针,第二个命令行参数名称,第三个是默认值,第四个是参数提示内容

以上是注册int类型的参数,其他类似是类似的

func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Int(name string, value int, usage string) *int
func IntVar(p *int, name string, value int, usage string)
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func Uint(name string, value uint, usage string) *uint
func UintVar(p *uint, name string, value uint, usage string)
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, 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)

解析flag

直接调用Parse函数,就可以解析所有注册的flag。

flag.Parse()

注意:切记!!! 一定要调用这个 Parse函数 ,否则你前面即使注册了flag,也用不了。 你可以命令行 加-h,如果你没有执行flag.Parse(),那么-h就没有效果。否则,就会打印出来你注册的flag。

参数形式

命令行 flag 的语法有如下三种形式:

-flag // 只支持bool类型
-flag=x
-flag x // 只支持非bool类型

变量使用

如果使用 flag.Int 方式声明的就需要通过&方式取值

fmt.Println(&number)

如果是使用 flag.IntVar 方式声明的就可以直接使用了。

fmt.Println(number)

二、【推荐】什么是spf13/pflag包

github:https://github.com/spf13/pflag

pflag是Go的flag包的直接替代,实现了POSIX/GNU样式的flags。pflag是Go的本机标志包的直接替代。如果您在名称“ flag”下导入pflag (如:import flag "github.com/spf13/pflag"),则所有代码应继续运行且无需更改。

  • 一个命令行参数在 Pflag 包中会被解析为一个 Flag 类型的变量。
  • FlagSet 是 Flag 类型的集合, 几乎所有的 Pflag 操作,都需要借助 FlagSet 的方法来完成

总结:事实上第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛。pflag 包的设计目的就是替代标准库中的 flag 包,因此它具有更强大的功能并且与标准的兼容性更好。

pflag 包的主要特点

pflag 包与 flag 包的工作原理甚至是代码实现都是类似的,下面是 pflag 相对 flag 的一些优势:

  • 支持更加精细的参数类型:例如,flag 只支持 uint 和 uint64,而 pflag 额外支持 uint8、uint16、int32 等类型。
  • 支持更多参数类型:ip、ip mask、ip net、count、以及所有类型的 slice 类型。
  • 兼容标准 flag 库的 Flag 和 FlagSet:pflag 更像是对 flag 的扩展。
  • 原生支持更丰富的功能:支持 shorthand、deprecated、hidden 等高级功能。

什么是命令行pflag

# server是commands,port是flag
hugo server --port=1313

# clone是commands,URL是arguments,brae是flags
git clone URL --bare

总结:默认标志位:--
--flag // boolean flags, or flags with no option default values
--flag x // only on flags without a default value
--flag=x

如何使用

go pflag命令行参数解析详解
参考URL: https://blog.csdn.net/xixihahalelehehe/article/details/105961377

  • 定义flag可以使用flag.String(), Bool(), Int()等:
var age *int = flag.Int("age", 1234, "help message for age")
var name *string = flag.String("name", "default name", "help message for name")
var enable * bool= flag.Bool("enable", true, "help message for enable")
  • 短参数命令只需要在对应函数后面加一个P即可,第二个参数为对应的短命令,返回值为值本身而不是指针了
// 定义命令行参数对应的变量
var cliName = flag.StringP("name", "n", "nick", "Input Your Name")
var cliAge = flag.IntP("age", "a",, "Input Your Age")
var cliGender = flag.StringP("gender", "g","male", "Input Your Gender")
var cliOK = flag.BoolP("ok", "o", false, "Input Are You OK")
var cliDes = flag.StringP("des-detail", "d", "", "Input Description")

注意添加最后一项,参数描述信息。

我们不需要单独处理 -h--help,pflag会自动生产你命令的help参数说明。

  • pflag 参数标记未废弃或隐藏
    pflag 包还支持在参数说明中隐藏参数的功能
    如下,一个添加要隐藏的参数
	flag.CommandLine.MarkHidden("ip")
	flag.CommandLine.MarkHidden("no")

代码demo

package main

import (
    "fmt"
    "github.com/spf13/pflag"
)

func main() {
    var (
        host string
        port int
    )

    // 结尾的Var表示支持将参数的值,绑定到变量
    pflag.StringVar(&host, "host", "127.0.0.1", "MySQL service host address.")
    // 结尾的P表示支持短选项
    pflag.IntVarP(&port, "port", "P", 3306, "MySQL service host port.")
    // 弃用 port 的简写形式
    pflag.CommandLine.MarkShorthandDeprecated("port", "please use --port only")

    // 弃用标志
    pflag.StringVar(&host, "Host", "127.0.0.1", "MySQL service host address.")
    pflag.CommandLine.MarkDeprecated("Host", "please use --host instead")

    // 如果没有指定命令行参数 host, 则 host 变量的值是 127.0.0.1
    // 如果指定了命令行参数 host,但是没有设置它的值,则 host 变量的值是 localhost
    // 通过 Lookup 方法,修改 pflag 对象的 field
    pflag.Lookup("host").NoOptDefVal = "localhost"

    pflag.Parse()

    fmt.Printf("host: %v\n", host)
    fmt.Printf("port: %v\n", port)

    // CommandLine 是默认的全局 FlagSet 对象
    fmt.Println(pflag.CommandLine.GetInt("port"))



    // 获取非命令行参数
    fmt.Printf("argument number is: %v\n", pflag.NArg())
    fmt.Printf("argument list is: %v\n", pflag.Args())
    fmt.Printf("the first argument is: %v\n", pflag.Arg(0))
}

demo2:

func main() {
	//定义命令行参数方式1
	var name string
	var age int
	var married bool
	var delay time.Duration
	flag.StringVar(&name, "name", "张三", "姓名")
	flag.IntVar(&age, "age", 18, "年龄")
	flag.BoolVar(&married, "married", false, "婚否")
	flag.DurationVar(&delay, "d", 0, "延迟的时间间隔")

	//解析命令行参数
	flag.Parse()
	fmt.Println(name, age, married, delay)
	//返回命令行参数后的其他参数
	fmt.Println(flag.Args())
	//返回命令行参数后的其他参数个数
	fmt.Println(flag.NArg())
	//返回使用的命令行参数个数
	fmt.Println(flag.NFlag())
}

输出

$ ./flag_demo -help
Usage of ./flag_demo:
  -age int
        年龄 (default 18)
  -d duration
        时间间隔
  -married
        婚否
  -name string
        姓名 (default "张三")

三、参考

Golang的spf13/pflag入门示例
参考URL:https://www.cnblogs.com/lovezbs/p/14173328.html
go pflag命令行参数解析详解
参考URL: https://blog.csdn.net/xixihahalelehehe/article/details/105961377

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值