golang 程序獲取命令行參數,然後根據傳遞的參數做不同的邏輯處理
通過os.Args 獲取
os.Args 變量是個string切片,我們可以通過API 手冊得知,os包裏面定義了這個變量。
var Args []string
Args保管了命令行參數,第一個是程序名,下面通過實例來演示下如何解析命令行參數
package main
import (
"fmt"
"os"
)
func main() {
var cmdArgs []string
cmdArgs = os.Args
// 看看命令行參數個數
length := len(cmdArgs)
// 這裏計算命令行參數時候,命令本身不算
fmt.Printf("共有:%d 個參數\n", length - 1)
// 遍歷 通過命令行帶來的參數信息
if length == 1{
fmt.Println("沒有帶來任何參數")
return
}
for _, v := range cmdArgs {
fmt.Println(v)
}
}
編譯一把,得到一個可執行文件,然後通過命令行傳入參數。
dog500:demo08 dsm$ go build -o test main.go
dog500:demo08 dsm$ ./test aa bb cc dd ee fff
共有:6 個參數
./test
aa
bb
cc
dd
ee
fff
dog500:demo08 dsm$
這種方式解析命令參數不夠靈活,參數位置必須固定下來,否則程序裏面無法做業務邏輯處理。接下來介紹一種更靈活的解析方法
通過flag包解析命令行參數
package main
import (
"flag"
"fmt"
)
func main() {
// 模擬個mysql 用戶命令行登錄
var host, user, password string
var port int
flag.StringVar(&host, "h", "localhot", "主機地址")
flag.StringVar(&user, "u", "root", "用戶名")
flag.StringVar(&password, "p", "", "密碼")
flag.IntVar(&port, "P", 3306, "端口")
flag.Parse()
fmt.Println(host, user, password, port)
}
編譯部署、測試下
dog250:demo08 dsm$ ./demo -u root -p 123 -h 8.8.8.8 -P 9999
8.8.8.8 root 123 9999
dog250:demo08 dsm$ ./demo -u root -p 123 -h 8.8.8.8
8.8.8.8 root 123 3306
dog250:demo08 dsm$ ./demo -u root -p 123 -h 8.8.8.8 -P
flag needs an argument: -P
Usage of ./demo:
-P int
端口 (default 3306)
-h string
主機地址 (default "localhot")
-p string
密碼
-u string
用戶名 (default "root")
dog250:demo08 dsm$
是不是更加靈活了