1. 程式人生 > 其它 >golang中的標準庫flag

golang中的標準庫flag

Go語言內建的flag包實現了命令列引數的解析,flag包使得開發命令列工具更為簡單。

os.Args

如果你只是簡單的想要獲取命令列引數,可以像下面的程式碼示例一樣使用os.Args來獲取命令列引數。

func main() {
	// 獲取命令列引數
	// os.Args:[]string
	if len(os.Args) > 0 {
		for i, v := range os.Args {
			fmt.Println(i, v)
		}
	}
}

執行命令:go run .\main.go host:127.0.0.1 port:8080
輸出結果:

0 C:\Users\mayanan\AppData\Local\Temp\go-build3549800423\b001\exe\main.exe
1 host:127.0.0.1
2 port:8080

os.Args是一個儲存命令列引數的字串切片,它的第一個元素是執行檔案的名稱。

flag包基本使用

  1. flag引數型別
    flag包支援的命令列引數型別有bool、int、int64、uint、uint64、float float64、string、duration。
flag引數 有效值
字串flag 合法字串
整數flag 1234、0664、0x1234等型別,也可以是負數。
浮點數flag 合法浮點數
bool型別flag 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。
時間段flag 任何合法的時間段字串。如”300ms”、”-1.5h”、”2h45m”。 合法的單位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。

定義命令列flag引數

flag.Type()

基本格式如下:
flag.Type(flag名, 預設值, 幫助資訊)*Type例如我們要定義姓名、年齡、婚否三個命令列引數,我們可以按如下方式定義:

func main() {
	// flag.Type() 的使用
	name := flag.String("name", "張三", "姓名")
	age := flag.Int("age", 18, "年齡")
	married := flag.Bool("married", false, "婚否")
	delay := flag.Duration("d", 0, "時間間隔")

	flag.Parse()

	fmt.Println(*name, *age, *married, *delay)
}

終端輸入:
go run .\main.go -name lisi --age 88 -married=true --d=15s

輸出:
lisi 88 true 15s

flag.TypeVar()

基本格式如下: flag.TypeVar(Type指標, flag名, 預設值, 幫助資訊) 例如我們要定義姓名、年齡、婚否三個命令列引數,我們可以按如下方式定義:

func main() {
	var name string
	var age uint
	var married bool
	var d time.Duration

	flag.StringVar(&name, "name", "王五", "姓名")
	flag.UintVar(&age, "age", 18, "年齡")
	flag.BoolVar(&married, "m", false, "婚否")
	flag.DurationVar(&d, "duration", 0, "時間間隔")

	flag.Parse()

	fmt.Println(name, age, married, d)

}

輸入:
go run .\main.go -name lisi --age 35 -m=true --duration=1h15m36s

輸出:
lisi 35 true 1h15m36s

flag.Parse()

通過以上兩種方法定義好命令列flag引數後,需要通過呼叫flag.Parse()來對命令列引數進行解析。

支援的命令列引數格式有以下幾種:

-flag xxx (使用空格,一個-符號)
--flag xxx (使用空格,兩個-符號)
-flag=xxx (使用等號,一個-符號)
--flag=xxx (使用等號,兩個-符號)
其中,布林型別的引數必須使用等號的方式指定。

Flag解析在第一個非flag引數(單個”-“不是flag引數)之前停止,或者在終止符”–“之後停止。

flag其他函式

  • flag.Args() ////返回命令列引數後的其他引數,以[]string型別
  • flag.NArg() //返回命令列引數後的其他引數個數
  • flag.NFlag() //返回使用的命令列引數個數

完整示例

func main() {
	var name string
	var age uint
	var married bool
	var d time.Duration

	flag.StringVar(&name, "name", "王五", "姓名")
	flag.UintVar(&age, "age", 18, "年齡")
	flag.BoolVar(&married, "m", false, "婚否")
	flag.DurationVar(&d, "duration", 0, "時間間隔")

	flag.Parse()

	fmt.Println(name, age, married, d)  // lisi 35 true 1h15m36s

	fmt.Println(flag.Args())  // [abc true 123]
	fmt.Println(flag.NArg())  // 3
	fmt.Println(flag.NFlag())  //  4

}

輸入:
go run .\main.go -name lisi --age 35 -m=true --duration=1h15m36s abc true 123

輸出:

lisi 35 true 1h15m36s
[abc true 123]
3
4