flag支持的语言格式如下:

  • -flag     // bool类型only
  • -flag=x
  • -flag x  //not bool 类型

很自然,这个flag能够解析 -D /home/manu/DB_data,对应第二种类型,我们知道pg_ctl有-W选项,属于一个开关性质的bool型的选项

  1. -W do not wait until operation completes

自然对应第一种类型,也可以解析。第二种也很好理解。
    下面我给出一个例子,简单的解析这个pg_ctl的命令:

  1. manu@manu-hacks:~/code/go/self$ cat pg_ctl_parse.go
  2. package main
  3. import (
  4. "fmt"
  5. "flag"
  6. )
  7. func main(){
  8. data_path := flag.String("D","/home/manu/sample/","DB data path")
  9. log_file := flag.String("l","/home/manu/sample.log","log file")
  10. nowait_flag :=flag.Bool("W",false,"do not wait until operation completes")
  11. flag.Parse()
  12. var cmd string = flag.Arg(0);
  13. fmt.Printf("action   : %s\n",cmd)
  14. fmt.Printf("data path: %s\n",*data_path)
  15. fmt.Printf("log file : %s\n",*log_file)
  16. fmt.Printf("nowait     : %v\n",*nowait_flag)
  17. fmt.Printf("-------------------------------------------------------\n")
  18. fmt.Printf("there are %d non-flag input param\n",flag.NArg())
  19. for i,param := range flag.Args(){
  20. fmt.Printf("#%d    :%s\n",i,param)
  21. }
  22. }

OK,我们分析下代码( 分割线下面的我们暂时不看 ):
    第一行对应的是data_path的解析规则
    -D选项对应的值是字符串类型字符串,
    默认值是“/home/manu/sample”,
     DB data path 提示信息或者help信息或者说明是。

  1. 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参数就停止了:

  1. s := f.args[0]
  2. if len(s) == 0 || s[0] != '-' || len(s) == 1 {
  3. return false, nil
  4. }

所以如果我们将non-flag参数放在最前面,flag什么也不会解析,因为flag遇到了这个就停止解析了。

  1. 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 代码看到的。

  1. fmt.Printf("there are %d non-flag input param\n",flag.NArg())
  2. for i,param := range flag.Args(){
  3. fmt.Printf("#%d :%s\n",i,param)
  4. }

flag还提供了NFlag()获取那些匹配上的参数的个数。
    从例子上看,flag package很有用,但是并没有强大到解析一切的程度。
    如果你有类似-option或者-key =value这种参数

Go学习笔记:flag库的使用相关推荐

  1. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  2. android jackson xml,[Android学习笔记]jackson库的使用

    Jackson库一般用于序列化和反序列化操作,通常会涉及到的操作是: 1. Java Object -> Json String 2. Java Object -> Xml String ...

  3. PHP学习笔记-GD库与Jpgraph的使用

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52281196 本文出自:[顾林海的博客] 前言 学习PHP从第一篇笔记 ...

  4. C++11学习笔记-----线程库std::thread

    在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...

  5. go学习笔记-标准库

    标准库 名称 摘要 archive tar tar包实现了tar格式压缩文件的存取.zip zip包提供了zip档案文件的读写服务. bufio bufio 包实现了带缓存的I/O操作. builti ...

  6. C语言学习笔记--动态库和静态库的使用

    link 1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件. (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块 ...

  7. python学习笔记--turtle库的使用

    turtle库的调用方法 python中其他库的调用方法也一样 1.import <库名> 使用方法:<库名>.<函数名>(函数参数) 使用这种方法的好处就是,当一 ...

  8. Go学习笔记—标准库Context

    标准库Context ​ 由于goroutine没有父子关系,多个goroutine都是被平行的调度,所以在拉起多个goroutine后,程序的执行模型并没有维护树状结构的goroutine树,所以无 ...

  9. 七、MySQL DDL数据定义语言 学习笔记(库和表的创建、修改、删除详解 + 强化复习)

    DDL语言 数据定义语言 库和表的管理: 一.库的管理: 创建.修改.删除 二.表的管理: 创建.修改.删除 创建: create 修改: alter 删除: drop 一.库的管理 1.库的创建: ...

  10. Linux学习笔记-标准库中的管道操作

    目录 理论 例子 理论 stdio.h里面有标志库管道操作 FILE *popen(const char* cmdstring, const char *type);返回值:成功返回文件指针,出错返回 ...

最新文章

  1. 半年 5 战 5 金:Kaggle 史上最快 GrandMaster 是如何炼成的?
  2. 谷歌最强 NLP 模型 BERT 解读
  3. 源码分析(一) 进程cleos的命令解析
  4. 基于Java的RDMA高性能通信库(五):JXIO
  5. Tensorflow安装及过程中遇到的一些些问题
  6. [云炬创业基础笔记]第二章创业者测试8
  7. android开发日历库,Android SDK开发范例大全--5.5自制日历手机数据库笔记
  8. 营销区块链技术的艺术
  9. consumer和partition的数量建议
  10. Python 3.5.2 TypeError: a bytes-like object is required, not 'str’问题解决方案
  11. java 调用sqlite_java 调用 sqlite 数据库
  12. Git忽略项目中的指定的文件
  13. 资深前端工程师:裁人后,我总结了 7 个必备技能
  14. roseha linux,ROSEHA双机软件图解安装配置linux.docx
  15. matlab悬臂梁有限元分析
  16. ENVI5.1 进行监督分类流程化工具时(classification workflow)界面显示不全的问题解决办法
  17. 搜款网根据关键词取商品列表 API 返回值说明
  18. HIVE 系列 (4) hive 内部表和外部表HQL查询统计
  19. R语言中 attach()与detach(),及with()的使用
  20. 宽带连接连接被远程计算机终止 619,连接宽带时出错代号的含义

热门文章

  1. 【计算机网络】第三章数据链路层知识点及经典例题汇总
  2. 使用旅游电商系统对旅行社的四大好处
  3. 三步完成吉布斯采样Gibbs sampling
  4. matlab实现FCM算法
  5. 期权定价的数值方法之二项式期权定价模型【附pyrhon代码】
  6. 虚拟机启动时出现“已启用侧通道缓解”的解决方法
  7. day10上节内容补充和初始函数
  8. Android单元测试之 Mockito
  9. 词法分析(五):正规式与有限自动机
  10. 世界上第一款启用 QMK/VIA 的薄型无线机械键盘 Keychron K3 Pro 我刚刚入手