os.Args
這是符合簡單使用的方式。
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Args)
}
編譯后並在命令行中輸入:./args_test par1 par2 par3,會以空格分割。
輸出:[./args_test par1 par2 par3]
// os.Args是一個[]string
os.Args[0] // 是可執行文件本身
// 其他的元素以os.Args[n]取值
跟明顯,上面這種方式是不能指定參數的,所以這里引入另一種方式:
flag
代碼中使用
flag包支持的命令行參數類型有bool、int、int64、uint、uint64、 float64、string、duration。
| flag | 命令行中輸入值 |
|---|---|
| String | 合法字符串 |
| Int、Int64、 Uint、Uint64 | 1234、0664、0x1234等類型,也可以是負數。 |
| Float64 | 合法浮點數 |
| Bool | 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。 |
| Duration | 任何合法的時間段字符串。單位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”(如”300ms”、”-1.5h”、”2h45m”) |
flag用兩種使用方式:
- 1、返回數據類型的指針,不用自己提前聲明 (如:
flag.String())
格式:變量(指針) := flag.String("參數名字", "默認值", "提示信息,可以--help顯示")
如:
s := flag.String("name", "lczmx", "輸入名字")
fmt.Println(*s)
- 將自己聲明的指針傳進flag中,不用接收值 (如:
flag.StringVar())
格式:
var 變量
flag.String(&變量,"參數名字", "默認值", "提示信息,可以--help顯示")
flag.Parse()
// 之后就能操作該變量了
如:
var s string
flag.String(&s, "name", "lczmx", "輸入名字")
flag.Parse()
fmt.Println(s)
注:以上的String可以換成其他類型(Int、Bool、Float64、Duration等)
通過以上兩種方法定義好命令行flag參數后,還需要通過調用flag.Parse()來對命令行參數進行解析。
完整例子:
package main
import (
"flag"
"fmt"
"time"
)
func main() {
// 第一種方式
isOk := flag.Bool("isOk", false, "你ok嗎?")
t := flag.Duration("time", time.Second, "時間")
// 第二種方式
var age int
flag.IntVar(&age, "age", 18, "年齡")
flag.Parse()
fmt.Println("isOk", *isOk)
fmt.Println("time", *t)
fmt.Println("age", age)
}
命令行中輸入
命令行參數格式有以下幾種,可以混用:
./main -age xxx
./main --age xxx
./main -age=xxx
./main --age=xxx
使用help:(-h、--h、--help、-help),輸出:
Usage of /tmp/go-build771233563/b001/exe/main:
-age int
年齡 (default 18)
-isOk
你ok嗎?
-time duration
時間 (default 1s)
exit status 2
其他
flag.Args() ////返回命令行參數后的其他參數,以[]string類型
flag.NArg() //返回命令行參數后的其他參數個數
flag.NFlag() //返回使用的命令行參數個數
