加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang flag 解析入参

发布时间:2020-12-16 18:40:08 所属栏目:大数据 来源:网络整理
导读:首先一个例子: packagemainimport("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,"donotwaituntiloperationcompl

首先一个例子:

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:%sn",cmd)
fmt.Printf("datapath:%sn",*data_path)
fmt.Printf("logfile:%sn",*log_file)
fmt.Printf("nowait:%vn",*nowait_flag)

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

fmt.Printf("thereare%dnon-flaginputparamn",flag.NArg())
fori,param:=rangeflag.Args(){
fmt.Printf("#%d:%sn",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-flaginputparamn",param)
}

flag还提供了NFlag()获取那些匹配上的参数的个数。

从例子上看,flag package很有用,但是并没有强大到解析一切的程度。

如果你有类似-option或者-key =value这种参数,不妨试试 flag。如果你的入参解析非常复杂,flag可能捉襟见肘。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读