Go語言內置的flag包實作了命令列引數的決議,flag包使得開發命令列工具更為簡單,
os.Args
如果你只是簡單的想要獲取命令列引數,可以像下面的代碼示例一樣使用os.Args來獲取命令列引數,
package main
import (
"fmt"
"os"
)
//os.Args demo
func main() {
//os.Args是一個[]string
if len(os.Args) > 0 {
for index, arg := range os.Args {
fmt.Printf("args[%d]=%v\n", index, arg)
}
}
}
將上面的代碼執行go build -o "args_demo"編譯之后,執行:
$ ./args_demo a b c d args[0]=./args_demo args[1]=a args[2]=b args[3]=c args[4]=d
os.Args是一個存盤命令列引數的字串切片,它的第一個元素是執行檔案的名稱,
flag包基本使用
本文介紹了flag包的常用函式和基本用法,更詳細的內容請查看官方檔案,
匯入flag包
import flag
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引數的方法,
flag.Type()
基本格式如下:
flag.Type(flag名, 默認值, 幫助資訊)*Type
例如我們要定義姓名、年齡、婚否三個命令列引數,我們可以按如下方式定義:
name := flag.String("name", "張三", "姓名")
age := flag.Int("age", 18, "年齡")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("d", 0, "時間間隔")
需要注意的是,此時name、age、married、delay均為對應型別的指標,
flag.TypeVar()
基本格式如下: flag.TypeVar(Type指標, flag名, 默認值, 幫助資訊) 例如我們要定義姓名、年齡、婚否三個命令列引數,我們可以按如下方式定義:
var name string var age int var married bool var delay time.Duration flag.StringVar(&name, "name", "張三", "姓名") flag.IntVar(&age, "age", 18, "年齡") flag.BoolVar(&married, "married", false, "婚否") flag.DurationVar(&delay, "d", 0, "時間間隔")
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() {
//定義命令列引數方式1
var name string
var age int
var married bool
var delay time.Duration
flag.StringVar(&name, "name", "張三", "姓名")
flag.IntVar(&age, "age", 18, "年齡")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "d", 0, "延遲的時間間隔")
//決議命令列引數
flag.Parse()
fmt.Println(name, age, married, delay)
//回傳命令列引數后的其他引數
fmt.Println(flag.Args())
//回傳命令列引數后的其他引數個數
fmt.Println(flag.NArg())
//回傳使用的命令列引數個數
fmt.Println(flag.NFlag())
}
使用
命令列引數使用提示:
$ ./flag_demo -help Usage of ./flag_demo: -age int 年齡 (default 18) -d duration 時間間隔 -married 婚否 -name string 姓名 (default "張三")
正常使用命令列flag引數:
$ ./flag_demo -name 沙河娜扎 --age 28 -married=false -d=1h30m 沙河娜扎 28 false 1h30m0s [] 0 4
使用非flag命令列引數:
$ ./flag_demo a b c 張三 18 false 0s [a b c] 3 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/43059.html
標籤:Go
上一篇:Go語言標準庫之log
下一篇:Go語言標準庫之time
