作用
主要用來實現命令行的參數解析,以達到實現以下效果的目的
$ 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