作用
主要用來實作命令列的引數決議,以達到實作以下效果的目的
$ 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/33544.html
標籤:Go
上一篇:Go語言defer分析
下一篇:go: time包
