Go語言的參數解析(flag)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.