Go学习笔记:flag库的使用
flag支持的语言格式如下:
- -flag // bool类型only
- -flag=x
- -flag x //not bool 类型
很自然,这个flag能够解析 -D /home/manu/DB_data,对应第二种类型,我们知道pg_ctl有-W选项,属于一个开关性质的bool型的选项
- -W do not wait until operation completes
自然对应第一种类型,也可以解析。第二种也很好理解。
下面我给出一个例子,简单的解析这个pg_ctl的命令:
- manu@manu-hacks:~/code/go/self$ cat pg_ctl_parse.go
- package main
- import (
- "fmt"
- "flag"
- )
- func main(){
- data_path := flag.String("D","/home/manu/sample/","DB data path")
- log_file := flag.String("l","/home/manu/sample.log","log file")
- nowait_flag :=flag.Bool("W",false,"do not wait until operation completes")
- flag.Parse()
- var cmd string = flag.Arg(0);
- fmt.Printf("action : %s\n",cmd)
- fmt.Printf("data path: %s\n",*data_path)
- fmt.Printf("log file : %s\n",*log_file)
- fmt.Printf("nowait : %v\n",*nowait_flag)
- fmt.Printf("-------------------------------------------------------\n")
- fmt.Printf("there are %d non-flag input param\n",flag.NArg())
- for i,param := range flag.Args(){
- fmt.Printf("#%d :%s\n",i,param)
- }
- }
OK,我们分析下代码( 分割线下面的我们暂时不看 ):
第一行对应的是data_path的解析规则
-D选项对应的值是字符串类型字符串,
默认值是“/home/manu/sample”,
DB data path 提示信息或者help信息或者说明是。
- manu@manu-hacks:~/code/go/self$ go run pg_ctl_parse.go -D /home/manu/DB_data/ -l /home/manu/DB_data/postgres_manu.log -W start
action : start
data path: /home/manu/DB_data/
log file : /home/manu/DB_data/postgres_manu.log
nowait : true
-------------------------------------------------------
there are 1 non-flag input param
#0 :start
manu@manu-hacks:~/code/go/self$ go run pg_ctl_parse.go -l=/home/manu/DB_data/postgres_manu.log -W -D /home/manu/DB_data/ start
action : start
data path: /home/manu/DB_data/
log file : /home/manu/DB_data/postgres_manu.log
nowait : true
-------------------------------------------------------
there are 1 non-flag input param
#0 :start
我们看到了,解析出了data_path,log_file无论 -l -D出现的顺序如何,只要正常的出现了,就能正常的解析。
但是晴朗的天空中也有一片乌云,start不是这种 -key=alue 或则-option的类型,flag是解析不了的。我们称这种参数为non-flag参数,flag解析遇到non-flag参数就停止了:
- s := f.args[0]
- if len(s) == 0 || s[0] != '-' || len(s) == 1 {
- return false, nil
- }
所以如果我们将non-flag参数放在最前面,flag什么也不会解析,因为flag遇到了这个就停止解析了。
- manu@manu-hacks:~/code/go/self$ go run pg_ctl_parse.go start -l=/home/manu/DB_data/postgres_manu.log -W -D /home/manu/DB_data/
action : start
data path: /home/manu/sample
log file : /home/manu/sample.log
nowait : false
-------------------------------------------------------
there are 5 non-flag input param
#0 :start
#1 :-l=/home/manu/DB_data/postgres_manu.log
#2 :-W
#3 :-D
#4 :/home/manu/DB_data/
OK,flag提供了Arg(i),Args()来获取non-flag参数,NArg()来获取non-flag的个数。正如我们们sample 代码看到的。
- fmt.Printf("there are %d non-flag input param\n",flag.NArg())
- for i,param := range flag.Args(){
- fmt.Printf("#%d :%s\n",i,param)
- }
flag还提供了NFlag()获取那些匹配上的参数的个数。
从例子上看,flag package很有用,但是并没有强大到解析一切的程度。
如果你有类似-option或者-key =value这种参数
Go学习笔记:flag库的使用相关推荐
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- android jackson xml,[Android学习笔记]jackson库的使用
Jackson库一般用于序列化和反序列化操作,通常会涉及到的操作是: 1. Java Object -> Json String 2. Java Object -> Xml String ...
- PHP学习笔记-GD库与Jpgraph的使用
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52281196 本文出自:[顾林海的博客] 前言 学习PHP从第一篇笔记 ...
- C++11学习笔记-----线程库std::thread
在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...
- go学习笔记-标准库
标准库 名称 摘要 archive tar tar包实现了tar格式压缩文件的存取.zip zip包提供了zip档案文件的读写服务. bufio bufio 包实现了带缓存的I/O操作. builti ...
- C语言学习笔记--动态库和静态库的使用
link 1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件. (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块 ...
- python学习笔记--turtle库的使用
turtle库的调用方法 python中其他库的调用方法也一样 1.import <库名> 使用方法:<库名>.<函数名>(函数参数) 使用这种方法的好处就是,当一 ...
- Go学习笔记—标准库Context
标准库Context 由于goroutine没有父子关系,多个goroutine都是被平行的调度,所以在拉起多个goroutine后,程序的执行模型并没有维护树状结构的goroutine树,所以无 ...
- 七、MySQL DDL数据定义语言 学习笔记(库和表的创建、修改、删除详解 + 强化复习)
DDL语言 数据定义语言 库和表的管理: 一.库的管理: 创建.修改.删除 二.表的管理: 创建.修改.删除 创建: create 修改: alter 删除: drop 一.库的管理 1.库的创建: ...
- Linux学习笔记-标准库中的管道操作
目录 理论 例子 理论 stdio.h里面有标志库管道操作 FILE *popen(const char* cmdstring, const char *type);返回值:成功返回文件指针,出错返回 ...
最新文章
- 半年 5 战 5 金:Kaggle 史上最快 GrandMaster 是如何炼成的?
- 谷歌最强 NLP 模型 BERT 解读
- 源码分析(一) 进程cleos的命令解析
- 基于Java的RDMA高性能通信库(五):JXIO
- Tensorflow安装及过程中遇到的一些些问题
- [云炬创业基础笔记]第二章创业者测试8
- android开发日历库,Android SDK开发范例大全--5.5自制日历手机数据库笔记
- 营销区块链技术的艺术
- consumer和partition的数量建议
- Python 3.5.2 TypeError: a bytes-like object is required, not 'str’问题解决方案
- java 调用sqlite_java 调用 sqlite 数据库
- Git忽略项目中的指定的文件
- 资深前端工程师:裁人后,我总结了 7 个必备技能
- roseha linux,ROSEHA双机软件图解安装配置linux.docx
- matlab悬臂梁有限元分析
- ENVI5.1 进行监督分类流程化工具时(classification workflow)界面显示不全的问题解决办法
- 搜款网根据关键词取商品列表 API 返回值说明
- HIVE 系列 (4) hive 内部表和外部表HQL查询统计
- R语言中 attach()与detach(),及with()的使用
- 宽带连接连接被远程计算机终止 619,连接宽带时出错代号的含义