當我們希望通過命令行啟動Golang程序,獲取輸入的各種形式參數時,該如何處理呢?
[os.Args]
os.Args
是一個string的切片,用來存儲所有的命令行參數,包括go run main.go
這部分,整體編譯后實際是生成和運行的main.exe
文件,所以第一個參數是main.exe
。示例如下:
func main() { for i ,v := range os.Args { fmt.Println(i, v) } }
命令行攜帶參數啟動:go run main.go -name korbin aaa bbb ccc
0 C:\Users\Korbin\AppData\Local\Temp\go-build427584346\b001\exe\main.exe 1 -name 2 korbin 3 aaa 4 bbb 5 ccc
[flag]
Golang內置的flag
包提供了一系列解析命令行參數的功能接口,使用flag主要包括以下幾步:
1.定義flag命令行參數
1).通過flag.String()
, Bool()
, Int()
等flag.Xxx()
方法,該種方式返回一個相應的指針:
ip := flag.Int("name", "korbin", "the author's name")
方法中有三個參數:
name:表示指定的參數名,在命令行中輸入為-name或--name
value:表示默認值
usage:參數說明描述
2).通過flag.XxxVar()
方法將參數值綁定到一個變量,該種方式無返回值,如:
var name string flag.StringVar(&name , "name", "korbin", "the author's name")
3).通過flag.Var()
綁定自定義類型,自定義類型需要實現Value
接口(Receives必須為指針),如:
flag.Var(&name, "name", "the author's name")
對於這種類型的flag,默認值為該變量類型的初始值,即輸入的是int類型則默認為0,string默認為空等。
2.flag.Parse()
第二步,調用flag.Parse()
將命令行參數解析到定義的flag:
flag.Parse()
解析函數將會在碰到第一個非flag命令行參數時停止,非flag命令行參數是指不滿足命令行語法的參數,如命令行參數為cmd --flag=true abc
則第一個非 flag 命令行參數為“abc”
3.
通過上述定義參數和解析參數兩步,就已經是可以拿到我們的參數了。並且對於非命令行參數,還可通過flag.Args()
, flag.Arg(i)
來獲取 ~
package main import ( "flag" "fmt" "os" ) func main() { s := flag.String("name", "korbin", "這是作者的姓名") flag.Parse() fmt.Println("命令行參數name的值:",*s) fmt.Printf("非命令行參數切片:%v", flag.Args()) }
命令行攜帶參數啟動:go run main.go -name korbin aaa bbb ccc
,運行結果如下:
命令行參數name的值: korbin
非命令行參數切片:[aaa bbb ccc]
flag 支持的解析類型有下面四種
- -flag
- --flag
- -flag=x
- -flag x (bool 不能用這個)
有時候我們只需要一個 flag 就夠了,選項本身就帶着含義,不需要參數。而有些時候我們既需要 flag,也需要參數。注意區分好場景即可。如果用了第一種和第二種這種不帶參數的,本質含義就是個 bool,出現就是 true,不出現就看默認值。
flag參考:
- https://mp.weixin.qq.com/s/j-6tdYSdplY8Q2mwMgw8jQ