2013-11-04 56 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