在寫命令列程式(工具、server)時,對命令列引數進行解析,是一種常見的需求。各種語言一般都會提供相應的方法或庫,以方便開發者使用。在go標準庫中提供了乙個包:flag,方便進行命令列解析。也就是說,go的flag包用來解析命令列引數。
命令列flag的語法有如下三種形式:
-flag // 只支援bool型別
-flag=x
-flag x // 只支援非bool型別
其中,第一種形式只能用於bool型別。第三種形式只能用於非bool型別的flag。
第三種形式只能用於非bool型別的原因是:對於這樣的命令 cmd -x *,如果有乙個檔案名字是:0或false等,則命令的原意會改變。因為bool型別支援-flag這種形式,所以go語言在parse()方法中對bool型別進行了特殊處理。預設的,若提供了-flag,則對應的值為true;否則,則為flag.bool/boolvar中指定的預設值;如果希望顯示地設定為false,則使用-flag=false。
定義flags有兩種方式:
1)flag.***(),其中***可以是int、string等;返回乙個相應型別的指標,如:
var ip = flag.int("flagname", 123, "int flag for flagname")
2)flag.***var(),將flag繫結到乙個變數上,如:
var flagvar int
flag.intvar(&flagvar, "flagname", 123, "int flag for flagname")
另外,還可以建立自定義flag,只要實現flag.value介面即可(要求receiver是指標),這時候可以通過如下方式定義該flag:
flag.var(&flagval, "name", "help message for flagname")
例如,解析以英文逗號分割的字串直接到 slice 中,我們可以定義如下 value:
type slicevalue string
func newslicevalue(vals string, p *string) *slicevalue
func (s *slicevalue) set(val string) error
func (s *slicevalue) get() inte***ce{}
func (s *slicevalue) string() string
之後,可以這麼使用:
var languages string
flag.var(newslicevalue(string{}, &languages), "slice", "i like programming `languages`")
這樣通過 -slice 「go,php」 這樣的形式傳遞引數,languages 得到的就是 [go, php]。flag 包中對 duration 這種非基本型別的支援,使用的就是類似這樣的方式。
我們常用的api如下:
1. 直接獲取命令列引數
// 獲取名字為name的引數值,預設值為value,用法為usage
// 注意返回值是乙個指標
// 類似的方法還有 int(),bool()等。
func string(name string, value string, usage string) *string
2. 將獲取的命令列引數賦給指定值
// 這種方式p作為返回值,可以傳入變數的位址
// 類似的方法還有 intvar(),boolvar()等。
func stringvar(p *string, name string, value string, usage string)
3. 展示使用方法
// usage用來列印用法
var usage = func()
4. 解析引數
// 解析引數,應在設定完引數變數後呼叫
func parse()
**示例:
ackage main
import (
"flag"
"fmt"
// "os"
)func main()
執行示例如下:
$ go run flag.go -ok -id 11111 -port 8899 -name testuser very good
ok: true
id: 11111
port: 8899
name: testuser
other: [very good]
Go 用flag包解析命令列引數
flag包能解析的引數有如下四種形式,使用的時候分三種型別 型別一 cmd flag x 支援所有型別 cmd flag x 只支援非bool型別 型別二 cmd flag 只支援bool型別 型別三 cmd abc 沒有flag的引數 cmd flag x cmd flag x 只支援非bool型...
go 命令列解析工具包flag
在學習用go寫乙個jvm的時候,看到乙個go解析命令列的工具包flag包,記錄一下 flag包有兩種方式 1 flag.其中 可以是int string等 返回乙個相應型別的指標,如 cpvalue flag.strin ar cp classpath 第乙個引數cp是名字 第二個引數是預設值 第三...
Golang 使用flag包進行命令列引數解析
最近在使用go開發cli command line inte ce 時,通過對於官方文件以及他人部落格的學習,在此寫下個人認為更適合自己往後回顧的關於flag的使用說明。package main import fmt flag func main 從main往下看 第一句代表我們需要乙個w的命令列引...