golang 包之flag包
阿新 • • 發佈:2022-04-07
在golang中有很多方法來處理命令列引數,簡單情況下可以不使用任何庫,直接使用os.Args;但是golang標準庫提供了flag包來處理命令列引數;還有第三方提供的處理命令列引數的庫cobra、cli。
flag包繫結解析引數有三種定義方式
flag.xxx() 例如:flag.Int, flag.String, 返回解析變數型別的指標
package main import ( "flag" "fmt" ) func main() { host := flag.String("host", "127.0.0.1", "請輸入host地址") port := flag.Int("port", 3306, "請輸入埠號") flag.Parse() // 解析引數 fmt.Printf("%s:%d\n", *host, *port) }
執行: go run main.go -host=127.0.0.1 -port=3306
輸出:127.0.0.1:3306
當然你也可以直接執行go run main.go, 這時候就會使用你的預設值
flag.XxxVar() 例如:flag.IntVar, flag.StringVar
package main import ( "flag" "fmt" ) var host string var port intfunc init() { // 每個檔案會自動執行的函式 flag.StringVar(&host, "host", "127.0.0.1", "請輸入host地址") flag.IntVar(&port, "port", 3306, "請輸入埠號") } func main() { flag.Parse() // 解析引數 fmt.Printf("%s:%d\n", host, port) }
兩個flag共享同一個變數,一般用於同時實現完整flag引數和對應簡化版flag引數,需要注意初始化順序和預設值 var gopherType stringfunc init() { const ( defaultGopher = "pocket" usage = "the variety of gopher" ) flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage) flag.StringVar(&gopherType, "g", defaultGopher, usage+"(shorthand)") }
執行結果同上
3.自定義引數解析flag.Var(), 我們可以看下flag.go原始碼:
func Var(value Value, name string, usage string) {
CommandLine.Var(value, name, usage)
}
type Value interface {
String() string
Set(string) error
}
使用flag.Var函式第一個引數我們需要傳入一個Value型別的值,Value是一個介面型別,定義了兩個方法,接下來我們去實現這兩個方法:
package main import ( "flag" "fmt" "strings" ) // 自定義型別 type HandsomeBoys []string // 實現String()方法 func (h *HandsomeBoys) String() string { return fmt.Sprintf("%v", *h) } // 實現Set方法,Set介面決定了如何解析flag的值 func (h *HandsomeBoys) Set(s string) error { for _, v := range strings.Split(s, ",") { *h = append(*h, v) } return nil } // 定義一個HandsomeBoys型別的變數 var boys HandsomeBoys func init() { // 繫結變數boys flag.Var(&boys, "boys", "請輸入一組帥氣的男孩名稱:-boys=彭于晏,吳彥祖") } func main() { flag.Parse() fmt.Println(boys) }
首先需要理解FlagSet的概念,FlagSet的官方定義如下:
A FlagSet represents a set of defined flags.
直譯就是FlagSet代表一個flag的集合。
在具備FlagSet概念之後,我們再來回顧Flag的使用。
- 設定階段,就是往FlagSet中插入一條flag記錄,返回一個指向flag所代表的值的指標,flag記錄中包括預設值,flag名稱,用法;
- 解析階段,根據程式實際執行時引數的指定,覆蓋預設值;
- 使用階段,根據設定階段返回的指標,來獲取flag的值。
參考連結:https://blog.csdn.net/weixin_42278305/article/details/110133125