天天看點

了解Go語言元件flag

了解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