【问题标题】:Flag command line parsing in golang在 golang 中标记命令行解析
【发布时间】:2013-11-14 17:33:39
【问题描述】:

我不确定我是否理解这个示例背后的原因(取自 here),也不知道它试图传达的关于 Go 语言的内容:

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 完全陌生,所以只是想熟悉这种语言。

【问题讨论】:

  • gobyexample.com/command-line-flags 就是一个很好的例子。
  • 如果你想传递参数来解析程序f.Parse([]string{"-bool", "-int", "100"})的代码,你需要一个FlagSet。全局 flag.Parse() 函数不接受要解析的参数。此代码示例可以在无法提供命令行参数的 go code pad 之旅中运行。

标签: go command-line-arguments


【解决方案1】:

这是使用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)
}       

【讨论】:

  • 是的,这是首选方式。另一个不错的技巧是,您可以以更易于维护的方式使用 any 模块拆分模块特定标志中的标志模块
  • 所以init() 总是在main() 之前运行,并且它的变量可以在main 中访问? strFlag 也是一个指针,所以 * 用于检索值?
  • @lollercoaster 是的,尝试将标志放在非主模块中。请记住,如果您想从模块外部访问这些变量,则它们需要大写。
  • init()s 在 main 之前运行(所有这些 - 您可以在模块中的每个文件中包含 init,甚至可以在同一文件中包含多个 inits。inits 的执行顺序是未定义,所以不要在其中调用flag.Parse)。 Init 函数还有另一个限制 - 由它们启动的 goroutine 在 main 启动之前不会启动。 init 中的变量不与其他函数共享,strFlag 只是全局变量。
  • @mechmind 你所说的“甚至在同一个文件中有多个初始化”是什么意思,你能提供一个例子吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 2010-11-27
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2012-05-09
相关资源
最近更新 更多