這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。flag參數解析,我原以為會了,結果今天發現,原來比我印象中還強大些.
索性記一下.
第一個例子是常見用法:
//Flag例1//author:Xiong Chuan Liang//date:2015-4-10package mainimport ("flag""fmt""os")var ( levelFlag = flag.Int("level", 0, "層級") bnFlag int )func init() { flag.IntVar(&bnFlag, "bn", 3, "份數") }func main() {flag.Parse() count := len(os.Args) fmt.Println("參數總個數:",count) fmt.Println("參數詳情:") for i := 0 ; i < count ;i++{ fmt.Println(i,":",os.Args[i]) } fmt.Println("\n參數值:")fmt.Println("層級:", *levelFlag)fmt.Println("份數:", bnFlag)}/*運行結果:C:\TEMP\testflag>go run tf2.go -level 3 -bn=2參數總個數: 4參數詳情:0 : C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build158983983\command-line-arguments\_obj\exe\tf2.exe1 : -level2 : 33 : -bn=2參數值:層級: 3份數: 2*/
第二個例子,可以擴充功能:
//Flag例2//author:Xiong Chuan Liang//date:2015-4-10package mainimport ("flag""fmt""os""time")var (/*參數解析出錯時錯誤處理方式switch f.errorHandling {case ContinueOnError:return errcase ExitOnError:os.Exit(2)case PanicOnError:panic(err)} *///flagSet = flag.NewFlagSet(os.Args[0],flag.PanicOnError) flagSet = flag.NewFlagSet(os.Args[0],flag.ExitOnError) //flagSet = flag.NewFlagSet("xcl",flag.ExitOnError) verFlag = flagSet.String("ver", "", "version")xtimeFlag = flagSet.Duration("time", 10*time.Minute, "time Duration")addrFlag = StringArray{})func init() {flagSet.Var(&addrFlag, "a", "b")}func main() {fmt.Println("os.Args[0]:", os.Args[0])flagSet.Parse(os.Args[1:]) //flagSet.Parse(os.Args[0:])fmt.Println("當前命令列參數類型個數:", flagSet.NFlag()) for i := 0; i != flagSet.NArg(); i++ { fmt.Printf("arg[%d]=%s\n", i, flag.Arg(i)) } fmt.Println("\n參數值:")fmt.Println("ver:", *verFlag)fmt.Println("xtimeFlag:", *xtimeFlag)fmt.Println("addrFlag:",addrFlag.String())for i,param := range flag.Args(){ fmt.Printf("---#%d :%s\n",i,param) }}type StringArray []stringfunc (s *StringArray) String() string {return fmt.Sprint([]string(*s))}func (s *StringArray) Set(value string) error {*s = append(*s, value)return nil}/*運行結果:C:\TEMP\testflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0 -time 2m0sos.Args[0]: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build341936307\command-line-arguments\_obj\exe\tfs.exe當前命令列參數類型個數: 3參數值:ver: 10.0xtimeFlag: 2m0saddrFlag: [ba ca d2]C:\TEMP\testflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0os.Args[0]: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build712958211\command-line-arguments\_obj\exe\tfs.exe當前命令列參數類型個數: 2參數值:ver: 10.0xtimeFlag: 10m0saddrFlag: [ba ca d2]-- flagSet = flag.NewFlagSet(os.Args[0],flag.PanicOnError) 結果:C:\TEMP\testflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0 -time 2m0s33os.Args[0]: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build841833143\command-line-arguments\_obj\exe\tfs.exeinvalid value "2m0s33" for flag -time: time: missing unit in duration 2m0s33Usage of C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build841833143\command-line-arguments\_obj\exe\tfs.exe: -a=[]: b -time=10m0s: time Duration -ver="": versionpanic: invalid value "2m0s33" for flag -time: time: missing unit in duration 2m0s33goroutine 1 [running]:flag.(*FlagSet).Parse(0x10b18180, 0x10b42008, 0xc, 0xc, 0x0, 0x0) c:/go/src/flag/flag.go:814 +0xeemain.main() C:/TEMP/testflag/tfs.go:41 +0x163exit status 2-- flagSet = flag.NewFlagSet(os.Args[0],flag.ExitOnError) 結果:C:\TEMP\testflag>go run tfs.go -ver 9.0 -a ba -a ca -a d2 -ver 10.0 -time 2m0s33os.Args[0]: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build501686683\command-line-arguments\_obj\exe\tfs.exeinvalid value "2m0s33" for flag -time: time: missing unit in duration 2m0s33Usage of C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\go-build501686683\command-line-arguments\_obj\exe\tfs.exe: -a=[]: b -time=10m0s: time Duration -ver="": versionexit status 2*/
flagSet類可以讓參數處理更加靈活.
其中NewFlagSet:
flagSet = flag.NewFlagSet("xcl",flag.ExitOnError)
NewFlagSet的第一個參數是可以任意定的.但第二個參數,則決定了參數解析出錯時錯誤處理方式.
如果要擴充參數定義,只要實現下面的介面:
type Value interface {String() stringSet(string) error} 依例子中的 StringArray 一樣.就可以實現如:
-a ba -a ca -a d2
addrFlag: [ba ca d2]
這種效果.
要知道,同樣的:
-ver 9.0 -ver 10.0
最後的結果是 ver: 10.0 即參數只識別最末一次的.
沒想到還能通過interface進行擴充,並且其使用比起Linux的getopt()系列函數.flag包這種方式還是更清晰直觀.
BLOG: http://blog.csdn.net/xcl168