2013-11-04 82 views
14

我不知道我理解這背後的例子(從here採取)的理由,也沒有人知道它試圖瞭解Go語言溝通:標誌命令行解析在golang

package main 

import (
    "flag" 
    "fmt" 
) 

func main() { 
    f := flag.NewFlagSet("flag", flag.ExitOnError) 
    f.Bool("bool", false, "this is bool flag") 
    f.Int("int", 0, "this is int flag") 

    visitor := func(a *flag.Flag) { 
     fmt.Println(">", a.Name, "value=", a.Value) 
    } 

    fmt.Println("Visit()") 
    f.Visit(visitor) 
    fmt.Println("VisitAll()") 
    f.VisitAll(visitor) 

    // set flags 
    f.Parse([]string{"-bool", "-int", "100"}) 

    fmt.Println("Visit() after Parse()") 
    f.Visit(visitor) 
    fmt.Println("VisitAll() after Parse()") 
    f.VisitAll(visitor) 
} 

沿東西線設置的他們卻再加入

int_val := f.get("int") 

獲得命名參數似乎更加有用。我對Go完全陌生,所以只是想熟悉這門語言。

+2

https://gobyexample.com/command-line-flags就是一個很好的例子。 – elithrar

+0

如果您想傳遞參數以解析程序f.Parse([] string {「 - bool」,「-int」,「100」})''的代碼,則需要FlagSet。全局的'flag.Parse()'函數不接受一個參數來解析。這個代碼示例可以在遊覽代碼區的地方運行,您不能提供命令行參數。 – chmike

回答

36

這是使用flag包的複雜的例子。通常以這種方式設置標誌:

package main 

import "flag" 

// note, that variables are pointers 
var strFlag = flag.String("long-string", "", "Description") 
var boolFlag = flag.Bool("bool", false, "Description of flag") 

func init() { 
    // example with short version for long flag 
    flag.StringVar(strFlag, "s", "", "Description") 
} 

func main() { 
    flag.Parse() 
    println(*strFlag, *boolFlag) 
}  
+3

是的,這是首選的方法。另一個不錯的訣竅是你可以使用任何*模塊分割模塊特定標誌的標誌模塊以更易維護的方式 – fabrizioM

+0

因此'init()'總是在'main()'之前運行,並且它的變量可以在'main' ? 'strFlag'是一個指針,所以*用於檢索值? – lollercoaster

+0

@fabrizioM:來自任何模塊?這到底意味着什麼?來自python背景,所以好像你的意思是我們從我的項目中導入的其他文件也可以使用相同的標誌變量?那將是一件很酷的事情。 – lollercoaster