理解Go語言組件flag

理解Go語言組件flag
作用#
主要用來實現命令行的參數解析,以達到實現以下效果的目的

Copy
$ cmd -flagname 123
使用方式#
flag是Go語言的內置包,能接收的參數類型主要有字符串、布爾和數值類型。

方式一#
Copy
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來解析命令,否則不能執行成功。我們來測試一下,先鍵入一個錯的參數,會得到以下提示。

Copy
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參數和值,可以直接獲取到對應的值

Copy
go run main.go -ip 192.168.1.1

192.168.1.1
除了-ip 192.168.1.1這種形式外,以等號賦值的方式也是支持的

Copy
go run main.go -ip=192.168.1.1

192.168.1.1
現在什麼都不傳,可以直接拿到設置的默認值

Copy
go run main.go

127.0.0.1
方式二#
除上述內容之外,還有一種寫法,我們再增加一個端口號爲例

Copy
var port int

func init() {

flag.IntVar(&port, "port", 80, "端口號")

}

func main() {

flag.Parse()
fmt.Println("port", port)

}
首先定義一個整型變量port,在init函數中調用flag.IntVar函數,該函數與flag.String相比,少了返回值,且多一個參數,第一個參數是預先定義好的變量,爲了方便IntVar內部修改變量值,所以該參數傳引用類型。

方式三#
如果我們想在接收參數值的過程當中做一些處理,那麼也可以自己進行實現。假如我們需要對傳入的用戶名user進行處理,加上一個_suffix後綴。

Copy
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。

Copy
var userFlag user

func main() {

flag.Var(&userFlag, "user", "用戶名")
flag.Parse()
fmt.Println(userFlag)

}
接下來定義一個user類型的變量,然後在main函數中調用flag.Var方法,將變量地址傳入,接下來執行命令做測試。

Copy
go run flagVar.go -user pingye
pingye_suffix
成功拼接上了後綴。

Go語言組件學習示例開源庫,歡迎star
https://github.com/EnochZg/golang-examples

作者: 平也

出處:https://www.cnblogs.com/enochzzg/p/12567403.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章