在 Golang 程式中有很多種方法來處理命令列參數。簡單的情況下可以不使用任何函式庫,直接處理 os.Args;其實 Golang 的標準函式庫提供了 flag 套件來處理命令列參數;還有第三方提供的處理命令列參數的函式庫,像是 Pflag 等。
flag套件提供了一系列解析指令列參數的功能介面 (建議學習:go)
指令行語法
命令列語法主要有以下幾種形式
-flag //只支持bool类型 -flag=x -flag x //只支持非bool类型
以上語法對於一個或兩個'-'號,效果是一樣的,但是要注意對於第三種情況,只支援非bool類型,原因是碰到如下情況時
cmd -x *
*為0,false有可能表示一個文件名或文件,也有可能表示x標籤的值為0或false,會產生二義性,因此規定第三種只支援非bool型別。對於整形flag,合法的值可以是1234, 0664,0x1234或負數等。對於布林型flag,可以為1, 0, t, f, T, F,true, false, TRUE, FALSE, True, False等
命令列參數解析方法
使用flag主要包括以下幾步
定義flag參數,有三種方式
透過flag.String(), Bool (), Int() 等flag.Xxx()方法,該種方式傳回一個對應的指標
import "flag" var ip = flag.Int("flagname", 1234, "help message for flagname")
透過flag.XxxVar()方法將flag綁定到一個變量,該種方式傳回值類型,例如
var flagvar int func init() { flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") }
透過flag.Var()綁定自訂類型,自訂類型需要實作Value介面(Receives必須為指標),例如
flag.Var(&flagVal, "name", "help message for flagname")
對於這種類型的flag,預設值為該變數類型的初始值
呼叫flag.Parse()解析命令列參數到定義的flag
flag.Parse()
解析函數將會在碰到第一個非flag命令列參數時停止,非flag命令列參數是指不滿足命令列語法的參數,如命令列參數為cmd --flag=true abc則第一個非flag命令列參數為「abc」
#呼叫Parse解析後,就可以直接使用flag本身(指標類型)或綁定的變數了(值型別)
fmt.Println("ip has value ", *ip) fmt.Println("flagvar has value ", flagvar)
還可透過flag.Args(), flag.Arg(i)來取得非flag命令列參數
以上是golang flag是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!