文章目录
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