Go 的 flag 包可以解析命令行的参数
Go 的 flag 包可以解析命令行的參數。
?一、命令行語法
命令行語法主要有以下幾種形式:
cmd -flag ? ? ? // 只支持bool類型
cmd -flag=xxx
cmd -flag xxx ? // 只支持非bool類型
以上語法對于一個或兩個‘-’號是一樣的,即
cmd -flag xxx (使用空格,一個 - 符號)
cmd --flag xxx (使用空格,兩個 - 符號)
cmd -flag=xxx (使用等號,一個 - 符號)
cmd --flag=xxx (使用等號,兩個 - 符號)?
對于整形 flag,合法的值可以為 1234,0664,0x1234 或 負數 等。對于布爾型 flag,可以為 1,0,t,f,T,F,true,false,TRUE,FALSE,True,False 等
其中,布爾類型的參數比較特殊,為了防止解析時的二義性,應該使用 等號 的方式指定
二、命令行參數方法
1.?定義flag參數
參數有三個:第一個為 參數名稱,第二個為 默認值,第三個是 使用說明
1>?通過 flag.String(),Bool(),Int() 等 flag.Xxx() 方法,該種方式返回一個相應的指針
| 1 | var ip = flag.Int("flagname", 1234, "help message for flagname") |
2>?通過 flag.XxxVar() 方法將 flag 綁定到一個變量,該種方式返回 值類型,如
| 1 2 | var flagvar int flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") |
3> 通過 flag.Var() 綁定自定義類型,自定義類型需要實現 Value 接口 (Receiver 必須為指針),如
| 1 | flag.Var(&flagVal, "name", "help message for flagname") |
2. 調用 flag.Parse() 解析命令行參數到定義的 flag
| 1 | flag.Parse() |
解析函數將會在碰到第一個 非flag 命令行參數時停止,非flag 命令行參數是指不滿足命令行語法的參數,如命令行參數為 cmd --flag=true abc 則第一個 非flag 命令行參數為“abc”
3. 調用 Parse 解析后,就可以直接使用 flag 本身(指針類型)或者綁定的變量了(值類型)
| 1 | fmt.Println("flagvar has value ", flagvar) |
還可通過 flag.Args(), flag.Arg(i) 來獲取 非flag 命令行參數!
三、實例
| 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 |
運行:
| 1 | ./flag -name=world |
輸出:
| 1 | Hello, world |
?
Go 還允許 自定義“命令行參數解析規則”,如下接口所示:
FlagSet 結構:
| 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))
總結
以上是生活随笔為你收集整理的Go 的 flag 包可以解析命令行的参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go 支持Protocol Buffer
- 下一篇: Golang gRPC 示例