Go 的 flag 包可以解析命令行的参数
Go 的 flag 包可以解析命令行的參數(shù)。
?一、命令行語法
命令行語法主要有以下幾種形式:
cmd -flag ? ? ? // 只支持bool類型
cmd -flag=xxx
cmd -flag xxx ? // 只支持非bool類型
以上語法對于一個(gè)或兩個(gè)‘-’號是一樣的,即
cmd -flag xxx (使用空格,一個(gè) - 符號)
cmd --flag xxx (使用空格,兩個(gè) - 符號)
cmd -flag=xxx (使用等號,一個(gè) - 符號)
cmd --flag=xxx (使用等號,兩個(gè) - 符號)?
對于整形 flag,合法的值可以為 1234,0664,0x1234 或 負(fù)數(shù) 等。對于布爾型 flag,可以為 1,0,t,f,T,F,true,false,TRUE,FALSE,True,False 等
其中,布爾類型的參數(shù)比較特殊,為了防止解析時(shí)的二義性,應(yīng)該使用 等號 的方式指定
二、命令行參數(shù)方法
1.?定義flag參數(shù)
參數(shù)有三個(gè):第一個(gè)為 參數(shù)名稱,第二個(gè)為 默認(rèn)值,第三個(gè)是 使用說明
1>?通過 flag.String(),Bool(),Int() 等 flag.Xxx() 方法,該種方式返回一個(gè)相應(yīng)的指針
| 1 | var ip = flag.Int("flagname", 1234, "help message for flagname") |
2>?通過 flag.XxxVar() 方法將 flag 綁定到一個(gè)變量,該種方式返回 值類型,如
| 1 2 | var flagvar int flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") |
3> 通過 flag.Var() 綁定自定義類型,自定義類型需要實(shí)現(xiàn) Value 接口 (Receiver 必須為指針),如
| 1 | flag.Var(&flagVal, "name", "help message for flagname") |
2. 調(diào)用 flag.Parse() 解析命令行參數(shù)到定義的 flag
| 1 | flag.Parse() |
解析函數(shù)將會(huì)在碰到第一個(gè) 非flag 命令行參數(shù)時(shí)停止,非flag 命令行參數(shù)是指不滿足命令行語法的參數(shù),如命令行參數(shù)為 cmd --flag=true abc 則第一個(gè) 非flag 命令行參數(shù)為“abc”
3. 調(diào)用 Parse 解析后,就可以直接使用 flag 本身(指針類型)或者綁定的變量了(值類型)
| 1 | fmt.Println("flagvar has value ", flagvar) |
還可通過 flag.Args(), flag.Arg(i) 來獲取 非flag 命令行參數(shù)!
三、實(shí)例
| 1 2 3 4 5 6 7 8 9 10 11 12 | package main import ( ??"flag" ??"fmt" ) ?? func main() { ??username := flag.String("name", "", "Input your username") ??flag.Parse() ??fmt.Println("Hello, ", *username) } |
編譯:
| 1 | go build flag.go |
運(yùn)行:
| 1 | ./flag -name=world |
輸出:
| 1 | Hello, world |
?
Go 還允許 自定義“命令行參數(shù)解析規(guī)則”,如下接口所示:
FlagSet 結(jié)構(gòu):
| 1 2 3 | type FlagSet struct { ????????Usage func() } |
示例:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main import ( ????"flag" ????"fmt" ) var myFlagSet = flag.NewFlagSet("myflagset", flag.ExitOnError) var stringFlag = myFlagSet.String("abc", "default value", "help mesage") func main() { ????myFlagSet.Parse([]string{"-abc", "def", "ghi", "123"}) ????args := myFlagSet.Args() ????for i := range args { ????????fmt.Println(i, myFlagSet.Arg(i)) ????} } |
- func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet
- func (f *FlagSet) Arg(i int) string
- func (f *FlagSet) Args() []string
- func (f *FlagSet) Bool(name string, value bool, usage string) *bool
- func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
- func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration
- func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string)
- func (f *FlagSet) Float64(name string, value float64, usage string) *float64
- func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string)
- func (f *FlagSet) Init(name string, errorHandling ErrorHandling)
- func (f *FlagSet) Int(name string, value int, usage string) *int
- func (f *FlagSet) Int64(name string, value int64, usage string) *int64
- func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string)
- func (f *FlagSet) IntVar(p *int, name string, value int, usage string)
- func (f *FlagSet) Lookup(name string) *Flag
- func (f *FlagSet) NArg() int
- func (f *FlagSet) NFlag() int
- func (f *FlagSet) Parse(arguments []string) error
- func (f *FlagSet) Parsed() bool
- func (f *FlagSet) PrintDefaults()
- func (f *FlagSet) Set(name, value string) error
- func (f *FlagSet) SetOutput(output io.Writer)
- func (f *FlagSet) String(name string, value string, usage string) *string
- func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
- func (f *FlagSet) Uint(name string, value uint, usage string) *uint
- func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64
- func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string)
- func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string)
- func (f *FlagSet) Var(value Value, name string, usage string)
- func (f *FlagSet) Visit(fn func(*Flag))
- func (f *FlagSet) VisitAll(fn func(*Flag))
總結(jié)
以上是生活随笔為你收集整理的Go 的 flag 包可以解析命令行的参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go 支持Protocol Buffer
- 下一篇: Golang gRPC 示例