了解Go語言元件flag
作用#
主要用來實作指令行的參數解析,以達到實作以下效果的目的
Copy
$ cmd -flagname 123
使用方式#
flag是Go語言的内置包,能接收的參數類型主要有字元串、布爾和數值類型。
方式一#
func main() {
var ip = flag.String("ip", "127.0.0.1", "此處傳入IP位址")
flag.Parse()
fmt.Println(*ip)
}
我們在main函數中調用flag.String函數來定義指令,該函數共有三個參數
第一個參數是指令名稱
第二個參數為預設值,也就是不傳ip時預設拿到的值
第三個參數是給使用者的提示
同時該函數傳回的是指針類型,列印變量ip時記得加上指針符号來輸出位址對應的值。在執行flag.String後,記得執行flag.Parse來解析指令,否則不能執行成功。我們來測試一下,先鍵入一個錯的參數,會得到以下提示。
go run main.go -i
flag provided but not defined: -i
Usage of /var/folders/3s/5v6r481x17x5ks_7q1dzmlsw0000gp/T/go-build400337564/b001/exe/main:
-ip string
此處傳入IP位址 (default "127.0.0.1")
加上-ip參數和值,可以直接擷取到對應的值
go run main.go -ip 192.168.1.1
192.168.1.1
除了-ip 192.168.1.1這種形式外,以等号指派的方式也是支援的
go run main.go -ip=192.168.1.1
現在什麼都不傳,可以直接拿到設定的預設值
go run main.go
127.0.0.1
方式二#
除上述内容之外,還有一種寫法,我們再增加一個端口号為例
var port int
func init() {
flag.IntVar(&port, "port", 80, "端口号")
flag.Parse()
fmt.Println("port", port)
首先定義一個整型變量port,在init函數中調用flag.IntVar函數,該函數與flag.String相比,少了傳回值,且多一個參數,第一個參數是預先定義好的變量,為了友善IntVar内部修改變量值,是以該參數傳引用類型。
方式三#
如果我們想在接收參數值的過程當中做一些處理,那麼也可以自己進行實作。假如我們需要對傳入的使用者名user進行處理,加上一個_suffix字尾。
type user string
func (u *user) String() string {
return fmt.Sprint(*u)
func (u *user) Set(value string) error {
if len(value) < 3 {
return errors.New("姓名長度不得小于3位")
}
*u = user(value + "_suffix")
return nil
首先需要定義一個類型,然後實作兩個方法String與Set,在Set方法中我對傳入的值進行了長度判斷,如果小于3個字元就抛出錯誤,否則就将傳入的值拼接一個字尾_suffix。
var userFlag user
flag.Var(&userFlag, "user", "使用者名")
flag.Parse()
fmt.Println(userFlag)
接下來定義一個user類型的變量,然後在main函數中調用flag.Var方法,将變量位址傳入,接下來執行指令做測試。
go run flagVar.go -user pingye
pingye_suffix
成功拼接上了字尾。
Go語言元件學習示例開源庫,歡迎star
https://github.com/EnochZg/golang-examples作者: 平也
出處:
https://www.cnblogs.com/enochzzg/p/12567403.html