pflag如何使用
1 为何我对这个库感兴趣呢?
因为我想看看Kubernetes的源码,Kubernetes,Hugo啥的都是那这个解析的命令行参数
2 安装
go get github.com/spf13/pflag
3 我自己写的例子
package main import (
"github.com/spf13/pflag"
"net"
"fmt"
"time"
) func pflagDefine() {
//64位整数,不带单标志位的
var pflagint64 *int64 = pflag.Int64("number1", , "this is int 64, without single flag") //64位整数,带单标志位的
var pflagint64p *int64 = pflag.Int64P("number2", "n", , "this is int 64, without single flag") //这种可以把变量的定义和变量取值分开,适合于struct,全局变量等地方
var pflagint64var int64
pflag.Int64Var(&pflagint64var, "number3", , "this is int64var") //上面那一种的增加短标志位版
var pflagint64varp int64
pflag.Int64VarP(&pflagint64varp,"number4", "m", , "this is int64varp") //slice版本,其实是上面的增强版,但是支持多个参数,也就是导成一个slice
var pflagint64slice *[]int64 = pflag.Int64Slice("number5", []int64{, }, "this is int64 slice") //bool版本
var pflagbool *bool = pflag.Bool("bool", true, "this is bool") //bytes版本
var pflagbyte *[]byte = pflag.BytesBase64("byte64", []byte("ea"), "this is byte base64") //count版本
var pflagcount *int= pflag.Count("count", "this is count") //duration版本
var pflagduration *time.Duration = pflag.Duration("duration", * time.Second, "this is duration") //float版本
var pflagfloat *float64 = pflag.Float64("float64", 123.345, "this is florat64") //IP版本
var pflagip *net.IP = pflag.IP("ip1", net.IPv4(, , , ), "this is ip, without single flag") //mask版本
var pflagmask *net.IPMask= pflag.IPMask("mask", net.IPv4Mask(,,,),"this is net mask") //string版本
var pflagstring *string= pflag.String("string", "teststring", "this is string") //uint版本
var pflaguint *uint64 = pflag.Uint64("uint64", , "this is uint64") pflag.Parse()
fmt.Println("number1 int64 is ", *pflagint64)
fmt.Println("number2 int64 is ", *pflagint64p)
fmt.Println("number3 int64var is ", pflagint64var)
fmt.Println("number4 int64varp is", pflagint64varp)
fmt.Println("number5 int64slice is", *pflagint64slice)
fmt.Println("bool is ", *pflagbool)
fmt.Println("byte64 is ", *pflagbyte)
fmt.Println("count is ", *pflagcount)
fmt.Println("duration is ", *pflagduration)
fmt.Println("float is ", *pflagfloat)
fmt.Println("ip1 net.ip is ", *pflagip)
fmt.Println("mask is %s", *pflagmask)
fmt.Println("string is ", *pflagstring)
fmt.Println("uint64 is ", *pflaguint) } func main() {
pflagDefine() }
说几个要点:
(1)Int64P比Int64多的是一个短标志位,注意:这里只能是一个字母
(2)pflagint64var比pflagint64多的是,可以导入一个指针参数而不是赋值。
这样的好处:可以把一些全局变量导入了,先声明,后导入
可以把struct导入了。
4 默认值
我们有两种默认值,一种是不使用这个标志位的时候默认值,另外一种是声明使用这个标志位,但是不赋值,这种对应的是NoOptDefVal。
| Parsed Arguments |
Parsed Arguments |
| --flagname=1357 | ip=1357 |
| --flagname | ip=4321 |
| [nothing] | ip=1234 |
5 放弃标志位
flags.MarkDeprecated("badflag", "please use --good-flag instead")
还告诉了用户,新的标志位是啥
6 放弃短标志位
flags.MarkShorthandDeprecated("noshorthandflag", "please use --noshorthandflag only")
只放弃短的,长标志位依然可以使用
7 隐藏一个标志位
flags.MarkHidden("secretFlag")
所以,没有文档字符串了
8 多标志位
--old-flag-name == --new-flag-name
func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
switch name {
case "old-flag-name":
name = "new-flag-name"
break
}
return pflag.NormalizedName(name)
}
myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)
9 替换原生的flag
完美兼容原生的,只需要改动一点点,你就可以用这个库了
import (
goflag "flag"
flag "github.com/spf13/pflag"
) var ip *int = flag.Int("flagname", , "help message for flagname") func main() {
flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
flag.Parse()
}
核心是import这部分
pflag如何使用的更多相关文章
- golang的Flag和Pflag
Flag和Pflag类似于python的argparse:解析命令行 flag是golang自带的包:github.com/spf13/pflag 参考:https://o-my-chenjian.c ...
- Golang : pflag 包简介
笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...
- golang中的pflag示例
现在晚上在家啃kubeadm的源码, 在啃源码前,pflag,viper,cobra这三件套好像是必须的, 那就先弄懂一下这三个套件的套路吧. 第一个,pflag. https://www.cnblo ...
- Linux开机自动登录(文本模式)
• Linux系统启动登录过程 以RedHat/CentOS为例,Linux系统Level3模式下从启动到登录的整个过程大致如下: 1> 加载BIOS信息:包含了CPU/显卡/内存/硬盘/网卡等 ...
- BUG-FREE-For Dream
一直直到bug-free.不能错任何一点. 思路不清晰:刷两天. 做错了,刷一天. 直到bug-free.高亮,标红. 185,OA(YAMAXUN)--- (1) findFirstDuplicat ...
- GO语言的开源库
Indexes and search engines These sites provide indexes and search engines for Go packages: godoc.org ...
- Linux命令学习总结:dos2unix - unix2dos
命令简介: dos2unix是将Windows格式文件转换为Unix.Linux格式的实用命令.Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2 ...
- Uva1624 Knots
极其鬼畜的题. 初见根本没有思路. 二见根本没有思路. …… 多年(并不)之后突然想到,也许可以用链表模拟. 先用链表把每一个节点串起来,并对有覆盖的地方进行标记. 模拟解锁操作,如果一个节点和它所覆 ...
- Uva11464 Even Parity
枚举每个格子的状态显然是不可能的. 思考发现,矩阵第一行的状态确定以后,下面的状态都可以递推出来. 于是状压枚举第一行的状态,递推全图的状态并判定是否可行. /*by SilverN*/ #inclu ...
随机推荐
- 19. Rootkit detectors (隐形工具包检测器 5个)
Sysinternals提供了许多小型Windows实用程序,对于低级别的Windows黑客攻击来说非常有用. 一些是免费的和/或包括源代码,而其他是专有的. 调查受访者最喜欢:ProcessExpl ...
- Linux第十一节课学习笔记
区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换. RUNTIME模式:当前生效,重启失效:PERM ...
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- js原型链的深度理解!
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...
- find命令简单使用
find命令是Linux系统查找文件的命令,能帮助用户在使用.管理Linux的日常事务时方便的查找出用户所需要的文件,find命令基本格式是:find [路径] [选项] [操作]. 列举一下find ...
- C++ 凸包生成算法
由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...
- 使用QTP12.2录制windows applications,没有脚本产生
使用QTP12.2录制windows applications,没有脚本产生解决方案:关闭电脑的杀毒软件和安全卫士,再进行录制,所有步骤录制成功.录制QTP自带程序flight,选择windows a ...
- [转]自建Syncthing中继服务器(私密传输或造福大众)
自建Syncthing中继服务器(私密传输或造福大众) 一.介绍 我之前介绍了Syncthing,作为一款开源的文件同步程序,它的功能还是非常强大的,我也很高兴能看到它被越来越多的人知道和使用,前几天 ...
- php5.5.7添加pgsql,pdo_pgsql,swoole
一:下载php源码sudo wget cn2.php.net/distributions/php-X.X.X.tar.gz 二:解压 tar xzf /php-X.X.X.tar.gz 三:进入源码e ...
- 和2018年年初做管理系统的不同(vuex)
从2017年底开始做公司批改后台系统(服务内部人员对熊猫小课用户的作业进行批改.对批改员工资结算等)到教务系统(服务于内部人员对熊猫小课等移动端产品的内容进行配置等).ai-boss系统(服务于内部人 ...