flag.Args()和 flag.NArg()的用法

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 ?
#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这种参数
本文来自:CSDN博客

感谢作者:qdx411324962

查看原文:Go学习笔记:flag库的使用

https://studygolang.com/articles/5608

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值