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語言躬它。