pflag 是 Go 的 flag 套件的直接替代品,實現 POSIX/GNU 風格的 --flags。
pflag 與命令列選項的 POSIX 建議的 GNU 擴充功能相容。有關更準確的描述,請參閱下面的「命令列標誌語法」部分。
pflag 與 Go 語言具有相同風格的 BSD 許可證,可以在 LICENSE 文件中找到。
pflag 可使用標準go get
指令取得。
透過運行安裝:
go get github.com/spf13/pflag
透過執行以下命令來執行測試:
go test github.com/spf13/pflag
pflag 是 Go 原生標誌包的直接替代品。如果您以“flag”名稱匯入 pflag,那麼所有程式碼都應該繼續運行,無需任何更改。
import flag "github.com/spf13/pflag"
對此有一個例外:如果您直接實例化 Flag 結構,則您還需要設定一個「Shorthand」欄位。大多數程式碼從不直接實例化該結構,而是使用 String()、BoolVar() 和 Var() 等函數,因此不受影響。
使用 flag.String()、Bool()、Int() 等定義標誌。
這宣告了一個整數標誌 -flagname,儲存在指標 ip 中,類型為 *int。
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
如果您願意,可以使用 Var() 函數將標誌綁定到變數。
var flagvar int
func init () {
flag . IntVar ( & flagvar , "flagname" , 1234 , "help message for flagname" )
}
或者,您可以建立滿足 Value 介面(帶有指標接收器)的自訂標誌,並將它們耦合到標誌解析:
flag . Var ( & flagVal , "name" , "help message for flagname" )
對於此類標誌,預設值只是變數的初始值。
定義所有標誌後,調用
flag . Parse ()
將命令列解析為定義的標誌。
然後可以直接使用標誌。如果您使用標誌本身,它們都是指針;如果你綁定到變量,它們就是值。
fmt . Println ( "ip has value " , * ip )
fmt . Println ( "flagvar has value " , flagvar )
如果您有 FlagSet 但發現很難跟上程式碼中的所有指針,則可以使用輔助函數來取得儲存在 Flag 中的值。如果您有一個 pflag.FlagSet ,其標誌名稱為“flagname”,類型為 int,則可以使用 GetInt() 來取得 int 值。但請注意,「flagname」必須存在且必須是 int。 GetString("flagname") 將會失敗。
i , err := flagset . GetInt ( "flagname" )
解析後,標誌後面的參數可用作切片 flag.Args() 或單獨用作 flag.Arg(i)。參數的索引從 0 到 flag.NArg()-1。
pflag 套件也定義了一些 flag 中沒有的新函數,它們為標誌提供了一個字母的簡寫。您可以透過將“P”附加到定義標誌的任何函數的名稱來使用它們。
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
var flagvar bool
func init () {
flag . BoolVarP ( & flagvar , "boolname" , "b" , true , "help message" )
}
flag . VarP ( & flagVal , "varname" , "v" , "help message" )
速記字母可以在命令列上與單破折號一起使用。布爾速記標誌可以與其他速記標誌組合。
預設的命令列標誌集由頂級函數控制。 FlagSet 類型允許定義一組獨立的標誌,例如在命令列介面中實現子命令。 FlagSet 的方法類似於命令列標誌集的頂層函數。
建立標誌後,可以為給定標誌設定 pflag.NoOptDefVal。這樣做會稍微改變標誌的意思。如果標誌具有 NoOptDefVal 並且在命令列上設定了該標誌但沒有選項,則該標誌將設定為 NoOptDefVal。例如給出:
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
flag . Lookup ( "flagname" ). NoOptDefVal = "4321"
會導致類似的結果
解析的參數 | 結果值 |
---|---|
--標誌名=1357 | ip=1357 |
--標誌名 | ip=4321 |
[沒有什麼] | ip=1234 |
--flag // boolean flags, or flags with no option default values
--flag x // only on flags without a default value
--flag=x
與 flag 套件不同,選項前的單破折號與雙破折號的意義不同。單破折號表示標誌的一系列簡寫字母。除最後一個速記字母外的所有速記字母都必須是布林標誌或具有預設值的標誌
// boolean or flags where the 'no option default value' is set
-f
-f=true
-abc
but
-b true is INVALID
// non-boolean and flags without a 'no option default value'
-n 1234
-n=1234
-n1234
// mixed
-abcs "hello"
-absd="hello"
-abcs1234
標誌解析在終止符“--”之後停止。與 flag 套件不同,flags 可以在命令列中此終止符之前的任何位置散佈參數。
整數標誌接受 1234、0664、0x1234,並且可能為負數。布林標誌(長形式)接受 1、0、t、f、true、false、TRUE、FALSE、True、False。持續時間標誌接受任何對 time.ParseDuration 有效的輸入。
可以設定自訂標誌名稱“標準化函數”。它允許標誌名稱在程式碼中創建時和在命令列上使用時更改為某種“規範化”形式。 “標準化”形式用於比較。下面是使用自訂標準化函數的兩個範例。
範例 #1 :您想要 -、_ 和 。在標誌中進行比較相同。又稱 --my-flag == --my_flag == --my.flag
func wordSepNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
from := [] string { "-" , "_" }
to := "."
for _ , sep := range from {
name = strings . Replace ( name , sep , to , - 1 )
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( wordSepNormalizeFunc )
範例#2 :您想要為兩個標誌起別名。又稱 --old-flag-name == --new-flag-name
func aliasNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
switch name {
case "old-flag-name" :
name = "new-flag-name"
break
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( aliasNormalizeFunc )
可以棄用一個標誌,或只是它的簡寫。棄用標誌/簡寫會將其隱藏在說明文字中,並在使用棄用的標誌/簡寫時列印使用訊息。
範例#1 :您想要棄用名為「badflag」的標誌,並告知使用者應該使用什麼標誌。
// deprecate a flag by specifying its name and a usage message
flags . MarkDeprecated ( "badflag" , "please use --good-flag instead" )
這會從幫助文本中隱藏“badflag”,並打印Flag --badflag has been deprecated, please use --good-flag instead
當使用“badflag”時。
範例#2 :您希望保留標誌名稱“noshorthandflag”,但不建議使用其短名稱“n”。
// deprecate a flag shorthand by specifying its flag name and a usage message
flags . MarkShorthandDeprecated ( "noshorthandflag" , "please use --noshorthandflag only" )
這會隱藏幫助文本中的簡稱“n”,並打印Flag shorthand -n has been deprecated, please use --noshorthandflag only
當使用簡稱“n”時。
請注意,使用訊息在這裡是必不可少的,並且不應該為空。
可以將標誌標記為隱藏,這意味著它仍將正常工作,但不會顯示在使用/幫助文字中。
範例:您有一個名為「secretFlag」的標誌,您只需要內部使用,並且不希望它出現在說明文字中,或使其使用文字可用。
// hide a flag by specifying its name
flags . MarkHidden ( "secretFlag" )
pflag
允許您停用幫助和使用訊息的標誌排序。
例子:
flags . BoolP ( "verbose" , "v" , false , "verbose output" )
flags . String ( "coolflag" , "yeaah" , "it's really cool flag" )
flags . Int ( "usefulflag" , 777 , "sometimes it's very useful" )
flags . SortFlags = false
flags . PrintDefaults ()
輸出:
-v, --verbose verbose output
--coolflag string it's really cool flag (default "yeaah")
--usefulflag int sometimes it's very useful (default 777)
為了支援使用 Go 的flag
包定義的標誌,必須將它們新增至pflag
標誌集中。這通常是支援第三方依賴項(例如golang/glog
)定義的標誌所必需的。
範例:您想要將 Go 標誌新增至CommandLine
標誌集
import (
goflag "flag"
flag "github.com/spf13/pflag"
)
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
func main () {
flag . CommandLine . AddGoFlagSet ( goflag . CommandLine )
flag . Parse ()
}
您可以在 godoc.org 上查看 pflag 包的完整參考文檔,或者通過運行godoc -http=:6060
並瀏覽到http://localhost:6060/pkg/github.com/spf13/pflag 通過go 的標準文檔系統查看pflag 套件的完整參考文件安裝後。