Golang的spf13/pflag入門示例


pflag 包的主要特點

  • 支持更加精細的參數類型: uintuint64uint8uint16int32等類型。
  • 支持更多參數類型:ipip maskip netcount、以及所有類型的 slice 類型。
  • 兼容標准 flag 庫的 Flag 和 FlagSet:pflag 更像是對 flag 的擴展。
  • 原生支持更豐富的功能:支持 shorthanddeprecatedhidden 等高級功能。

安裝 pflag 包

添加pflag包,用下面的命令安裝該包:

go get github.com/spf13/pflag 

入門 demo

Go workspacesr 目錄下創建 pflagdemo 目錄,並在目錄下創建 main.go 文件,編輯其內容如下:

package main import flag "github.com/spf13/pflag" import ( "fmt" "strings" ) // 定義命令行參數對應的變量 var cliName = flag.StringP("name", "n", "nick", "Input Your Name") var cliAge = flag.IntP("age", "a",22, "Input Your Age") var cliGender = flag.StringP("gender", "g","male", "Input Your Gender") var cliOK = flag.BoolP("ok", "o", false, "Input Are You OK") var cliDes = flag.StringP("des-detail", "d", "", "Input Description") var cliOldFlag = flag.StringP("badflag", "b", "just for test", "Input badflag") func wordSepNormalizeFunc(f *flag.FlagSet, name string) flag.NormalizedName { from := []string{"-", "_"} to := "." for _, sep := range from { name = strings.Replace(name, sep, to, -1) } return flag.NormalizedName(name) } func main() { // 設置標准化參數名稱的函數 flag.CommandLine.SetNormalizeFunc(wordSepNormalizeFunc) // 為 age 參數設置 NoOptDefVal flag.Lookup("age").NoOptDefVal = "25" // 把 badflag 參數標記為即將廢棄的,請用戶使用 des-detail 參數 flag.CommandLine.MarkDeprecated("badflag", "please use --des-detail instead") // 把 badflag 參數的 shorthand 標記為即將廢棄的,請用戶使用 des-detail 的 shorthand 參數 flag.CommandLine.MarkShorthandDeprecated("badflag", "please use -d instead") // 在幫助文檔中隱藏參數 gender flag.CommandLine.MarkHidden("badflag") // 把用戶傳遞的命令行參數解析為對應變量的值 flag.Parse() fmt.Println("name=", *cliName) fmt.Println("age=", *cliAge) fmt.Println("gender=", *cliGender) fmt.Println("ok=", *cliOK) fmt.Println("des=", *cliDes) } 

運行 demo

在 flagdemo 目錄下執行 go build 命令編譯 demo 生成可執行文件 flagdemo。下面我們通過運行 demo 程序來了解 pflag 包命令行參數的語法特點。

布爾類型的參數
布爾類型的參數有下面幾種寫法

--flag // 等同於 --flag=true --flag=value --flag value // 這種寫法只有在沒有設置默認值時才生效 

NoOptDefVal 用法

pflag 包支持通過簡便的方式為參數設置默認值之外的值,實現方式為設置參數的 NoOptDefVal 屬性:

var cliAge = flag.IntP("age", "a",22, "Input Your Age") flag.Lookup("age").NoOptDefVal = "25" 

下面是傳遞參數的方式和參數最終的取值:

Parsed Arguments     Resulting Value
--age=30 cliAge=30 --age cliAge=25 [nothing] cliAge=22 

shorthand

與 flag 包不同,在 pflag 包中,選項名稱前面的 --- 是不一樣的。- 表示 shorthand-- 表示完整的選項名稱。

除了最后一個 shorthand,其它的 shorthand 都必須是布爾類型的參數或者是具有默認值的參數。
所以對於布爾類型的參數和設置了 NoOptDefVal 的參數可以寫成下面的形式:

-o -o=true // 注意,下面的寫法是不正確的 -o true 

非布爾類型的參數和沒有設置 NoOptDefVal 的參數的寫法如下:

-g female -g=female -gfemale 

日常的使用中一般會混合上面的兩類規則:

-aon "jack" -aon="jack" -aon"jack" -aonjack -oa=35 

注意 -- 后面的參數不會被解析:

-oa=35 -- -gfemale 

標准化參數的名稱

如果我們創建了名稱為 --des-detail 的參數,但是用戶卻在傳參時寫成了 --des_detail--des.detail 會怎么樣?默認情況下程序會報錯退出,但是我們可以通過 pflag 提供的 SetNormalizeFunc 功能輕松的解決這個問題:

func wordSepNormalizeFunc(f *flag.FlagSet, name string) flag.NormalizedName { from := []string{"-", "_"} to := "." for _, sep := range from { name = strings.Replace(name, sep, to, -1) }  return flag.NormalizedName(name) } flag.CommandLine.SetNormalizeFunc(wordSepNormalizeFunc) 

這樣,下面的寫法也能識別了:

--des_detail="person detail" 

把參數標記為即將廢棄

在程序的不斷升級中添加新的參數和廢棄舊的參數都是常見的用例,pflag 包對廢棄參數也提供了很好的支持。通過 MarkDeprecated 和 MarkShorthandDeprecated 方法可以分別把參數及其 shorthand 標記為廢棄:

// 把 badflag 參數標記為即將廢棄的,請用戶使用 des-detail 參數 flag.CommandLine.MarkDeprecated("badflag", "please use --des-detail instead") // 把 badflag 參數的 shorthand 標記為即將廢棄的,請用戶使用 des-detail 的 shorthand 參數 flag.CommandLine.MarkShorthandDeprecated("badflag", "please use -d instead") 

在幫助文檔中隱藏參數

pflag 包還支持在參數說明中隱藏參數的功能:

// 在幫助文檔中隱藏參數 badflag flag.CommandLine.MarkHidden("badflag") 

這樣,幫助文檔中則不會顯示 badflag 的信息。其實在把參數標記為廢棄時,同時也會設置隱藏參數。



點擊這里


作者:半獸人
鏈接:https://www.orchome.com/9669
來源:OrcHome
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM