如何使用go做命令行flag解析

Using Command Line Flags in Go

Go有很多方式去處理CLIflags,第一種方式就是不適用任何庫桶良,使用os.Args檢測。第二種方式是去使用標(biāo)準(zhǔn)庫flag,第三種方式就是使用眾多第三方CLI庫之一,比如Cobra厢绝。

這次的內(nèi)容主要討論第二種方式,使用標(biāo)準(zhǔn)庫flag带猴,因為它在os.Args之上提供了諸多未處理的語法分析的便利昔汉,它還是內(nèi)建的。在使用前 import "flag"

接受一個int類型參數(shù):

func Int(name string, value int, usage string) *int

var count = flag.Int("count", 5, "the count of items")
fmt.Println("count value ", *count)

第一個參數(shù)是flag名字當(dāng)使用在CLI中拴清,第二個參數(shù)是默認(rèn)值靶病,第三個對于該參數(shù)的描述

flag.IntVar()提供了一種可以替換的語法

func IntVar(p *int, name string, value int, usage string)

var count int
flag.IntVar(&count, "count", 5, "the count of items")
fmt.Println("count value ", count)

這里參數(shù)發(fā)生了變化,第一個參數(shù)變成了變量的引用
兩者主要的差別就是第一個用例中你得到的是一個指針口予,第二個用例你得到的是一個值
flag提供了許多方法去分析不同的flag類型嫡秕,你可以用他們處理每一種你想接受的類型。

func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func IntVar(p *int, name string, value int, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func UintVar(p *uint, name string, value uint, usage string)

傳遞錯誤的數(shù)據(jù)類型會引發(fā)error苹威,暫停程序,還會將所需的用法打印給用戶驾凶。

如何去設(shè)置flag牙甫?

只需要將- flagname加入到CLI命令中,有四種等效的語法:

-count=x
-count x
--count=x
--count x

你可以向命令傳遞任意數(shù)量的flag调违,但是如果flag包認(rèn)不出你傳遞的flag它也會對停止對其它flag的解析窟哺,這意味著如果你還有其他非flag的參數(shù),一定要在開始時技肩,先使用所有的flag參數(shù)且轨,避免flag包停止解析。

解析flags:

在你定義好所有的flags之后虚婿,你需要去調(diào)用

flag.Parse()

這樣才能真正的解析他們

Boolean flags

Boolean flags設(shè)置的方法很簡單旋奢,只需要加-count,這會讓boollean flag得到true的值,如果設(shè)置false的值然痊,可以使用-count=false至朗。下面的值用于設(shè)置boolean flags都是有效的:

1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False.

在實際生產(chǎn)環(huán)境中,許多時候經(jīng)常會看到CIL應(yīng)用接受一個帶有描述性名稱的標(biāo)志剧浸,以及同一個帶有字母縮寫的標(biāo)志锹引,你可以通過提供兩個handler來實現(xiàn):
var gopherType string

func init() {
    const (
        defaultGopher = "pocket"
        usage         = "the variety of gopher"
    )
    flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
    flag.StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)")
}

what's next?

下一步還能做什么,你可以更深層次的去研究下去唆香,像別的CLI命令那樣嫌变,開發(fā)一些子命令,甚至還可以開發(fā)一個簡單的CLI工具通過Go語言躬它。

reference

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腾啥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碑宴,老刑警劉巖软啼,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異延柠,居然都是意外死亡祸挪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門贞间,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贿条,“玉大人,你說我怎么就攤上這事增热≌裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵峻仇,是天一觀的道長公黑。 經(jīng)常有香客問我,道長摄咆,這世上最難降的妖魔是什么凡蚜? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吭从,結(jié)果婚禮上朝蜘,老公的妹妹穿的比我還像新娘。我一直安慰自己涩金,他們只是感情好谱醇,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著步做,像睡著了一般副渴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上全度,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天佳晶,我揣著相機與錄音,去河邊找鬼讼载。 笑死轿秧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咨堤。 我是一名探鬼主播菇篡,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼一喘!你這毒婦竟也來了驱还?” 一聲冷哼從身側(cè)響起嗜暴,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎议蟆,沒想到半個月后闷沥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咐容,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年舆逃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳粒。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡路狮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔚约,到底是詐尸還是另有隱情奄妨,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布苹祟,位于F島的核電站砸抛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏树枫。R本人自食惡果不足惜锰悼,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望团赏。 院中可真熱鬧,春花似錦耐薯、人聲如沸舔清。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽体谒。三九已至,卻和暖如春臼婆,著一層夾襖步出監(jiān)牢的瞬間抒痒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工颁褂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留故响,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓颁独,卻偏偏與公主長得像彩届,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子誓酒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容