理解Go語言組件flag


作用

主要用來實現命令行的參數解析,以達到實現以下效果的目的

$ 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

192.168.1.1

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

go run main.go

127.0.0.1

方式二

除上述內容之外,還有一種寫法,我們再增加一個端口號為例

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后綴。

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

func main() {
	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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM