文档章节

golang编程之package flag解析入参

徐学良
 徐学良
发布于 2015/08/25 09:12
字数 942
阅读 44
收藏 0

 我们随便写一个日常使用的psql的命令行用法

view sourceprint?

1.manu@manu-hacks:~$ pg_ctl -D /home/manu/DB_data/ -l /home/manu/DB_data/postgres_manu.log   start

2.server starting

这种情况下我们更需要的是解析各个参数的意义,比如-D选项 是通知pg_ctl pgdata的路径在那,-l选项告知的是log记录到那个文件,start相当于子命令,告知action。对于这种命令,我们都知道C语言有getopt及其getopt_long来解决。go语言怎么解决?
   go语言提供了flag这个package。来应对这种入参的解析。
   flag支持的语言格式如下:

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


view sourceprint?

1.-W do not wait until operation completes

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

view sourceprint?

01.manu@manu-hacks:~/code/go/self$ cat pg_ctl_parse.go

02.

03.

04.package main

05.import (

06.    "fmt"

07.    "flag"

08.)

09.

10.func main(){

11.

12.    data_path := flag.String("D","/home/manu/sample/","DB data path")

13.    log_file := flag.String("l","/home/manu/sample.log","log file")

14.    nowait_flag :=flag.Bool("W",false,"do not wait until operation completes")

15.

16.    flag.Parse()

17.

18.    var cmd string = flag.Arg(0);

19.

20.    fmt.Printf("action   : %s\n",cmd)

21.    fmt.Printf("data path: %s\n",*data_path)

22.    fmt.Printf("log file : %s\n",*log_file)

23.    fmt.Printf("nowait     : %v\n",*nowait_flag)

24.

25.    fmt.Printf("-------------------------------------------------------\n")

26.

27.    fmt.Printf("there are %d non-flag input param\n",flag.NArg())

28.    for i,param := range flag.Args(){

29.        fmt.Printf("#%d    :%s\n",i,param)

30.    }

31.

32.

33.}

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

view sourceprint?

01.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

02.action   : start

03.data path: /home/manu/DB_data/

04.log file : /home/manu/DB_data/postgres_manu.log

05.nowait : true

06.-------------------------------------------------------

07.there are 1 non-flag input param

08.#0 :start

09.

10.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

11.action   : start

12.data path: /home/manu/DB_data/

13.log file : /home/manu/DB_data/postgres_manu.log

14.nowait : true

15.-------------------------------------------------------

16.there are 1 non-flag input param

17.#0 :start

我们看到了,解析出了data_path,log_file无论 -l -D出现的顺序如何,只要正常的出现了,就能正常的解析。
   但是晴朗的天空中也有一片乌云,start不是这种 -key=alue 或则-option的类型,flag是解析不了的。我们称这种参数为non-flag参数,flag解析遇到non-flag参数就停止了:

view sourceprint?

1.s := f.args[0]

2.if len(s) == 0 || s[0] != '-' || len(s) == 1 {

3.    return false, nil

4.}

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

view sourceprint?

01.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/  

02.action   : start

03.data path: /home/manu/sample

04.log file : /home/manu/sample.log

05.nowait   : false

06.-------------------------------------------------------

07.there are 5 non-flag input param

08.#0 :start

09.#1 :-l=/home/manu/DB_data/postgres_manu.log

10.#2 :-W

11.#3 :-D

12.#4 :/home/manu/DB_data/

OK,flag提供了Arg(i),Args()来获取non-flag参数,NArg()来获取non-flag的个数。正如我们们sample 代码看到的。  

view sourceprint?

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这种参数,不妨试试 flag。如果你的入参解析非常复杂,flag可能捉襟见肘。

本文转载自:http://www.it165.net/os/html/201311/6723.html

徐学良
粉丝 24
博文 213
码字总数 13841
作品 0
浦东
程序员
私信 提问
golang flag 解析入参

首先一个例子: package mainimport ( "fmt" "flag") func main(){ data_path := flag.String("D","/home/manu/sample/","DB data path") log_file := flag.String("l","/home/manu/sample.l......

冷絮
2015/08/25
41
0
go实现的简易TCP的客户端和服务器

今天介绍golang版本的通信基础:基于TCP的客户端和服务器实现,参考书籍:The Way To Go 那时学习java的时候也是做过通信的,当时是socket编程,服务器监听某一个端口,然后客户机去连接,简...

徐学良
2015/08/28
532
0
golang实现命令行程序的使用帮助

通过包我们可以很方便的实现命令行程序的参数标志, 接下来我们来看看如何实现命令行程序的使用帮助, 通常以参数标志或的形式来使用. 自动生成使用帮助 我们只需要声明其他参数标志,并执行解析...

taadis
2017/03/24
114
0
golang同时使用命令行参数和配置文件

golang同时使用命令行参数和配置文件 [toc] 之前使用过框架,在配置参数传递上可以使用配置文件--applications.yml,也可以使用命令行参数来覆盖,用起来非常方便。那么golang有没有类似功能...

zhnxin
04/24
57
0
Golang Package-flag

一、命令行语法 命令行语法主要有以下几种形式: 以上语法对于一个或两个‘-’号是一样的 对于整形flag,合法的值可以为1234,0664,0x1234或负数等。对于布尔型flag,可以为1,0,t,f,T...

吃一堑消化不良
2016/12/01
40
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部