首先一个例子:
packagemain import( "fmt" "flag" ) funcmain(){ data_path:=flag.String("D","/home/manu/sample/","DBdatapath") log_file:=flag.String("l","/home/manu/sample.log","logfile") nowait_flag:=flag.Bool("W",false,"donotwaituntiloperationcompletes") flag.Parse() varcmdstring=flag.Arg(0); fmt.Printf("action:%s\n",cmd) fmt.Printf("datapath:%s\n",*data_path) fmt.Printf("logfile:%s\n",*log_file) fmt.Printf("nowait:%v\n",*nowait_flag) fmt.Printf("-------------------------------------------------------\n") fmt.Printf("thereare%dnon-flaginputparam\n",flag.NArg()) fori,param:=rangeflag.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$gorunpg_ctl_parse.go-D/home/manu/DB_data/-l/home/manu/DB_data/postgres_manu.log-Wstart action:start datapath:/home/manu/DB_data/ logfile:/home/manu/DB_data/postgres_manu.log nowait :true ------------------------------------------------------- thereare1non-flaginputparam #0 :start manu@manu-hacks:~/code/go/self$gorunpg_ctl_parse.go-l=/home/manu/DB_data/postgres_manu.log-W-D/home/manu/DB_data/start action:start datapath:/home/manu/DB_data/ logfile:/home/manu/DB_data/postgres_manu.log nowait :true ------------------------------------------------------- thereare1non-flaginputparam #0 :start
我们看到了,解析出了data_path,log_file无论 -l -D出现的顺序如何,只要正常的出现了,就能正常的解析。
但是晴朗的天空中也有一片乌云,start不是这种 -key=alue 或则-option的类型,flag是解析不了的。我们称这种参数为non-flag参数,flag解析遇到non-flag参数就停止了:
s:=f.args[0] iflen(s)==0||s[0]!='-'||len(s)==1{ returnfalse,nil }
所以如果我们将non-flag参数放在最前面,flag什么也不会解析,因为flag遇到了这个就停止解析了。
manu@manu-hacks:~/code/go/self$gorunpg_ctl_parse.gostart-l=/home/manu/DB_data/postgres_manu.log-W-D/home/manu/DB_data/ action:start datapath:/home/manu/sample logfile:/home/manu/sample.log nowait:false ------------------------------------------------------- thereare5non-flaginputparam #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("thereare%dnon-flaginputparam\n",param) }
flag还提供了NFlag()获取那些匹配上的参数的个数。
从例子上看,flag package很有用,但是并没有强大到解析一切的程度。
如果你有类似-option或者-key =value这种参数,不妨试试 flag。如果你的入参解析非常复杂,flag可能捉襟见肘。
原文链接:https://www.f2er.com/go/190251.html