在golang中标记命令行解析

lol*_*ter 18 go command-line-arguments

我不确定我理解这个例子背后的原因(从这里开始),也不知道它试图传达的关于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)
}
Run Code Online (Sandbox Code Playgroud)

他们有一些设置,但随后添加了一个

int_val := f.get("int")
Run Code Online (Sandbox Code Playgroud)

获得命名参数似乎更有用.我是Go的新手,所以只是试着熟悉这门语言.

mec*_*ind 44

这是一个复杂的使用例子 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)
}       
Run Code Online (Sandbox Code Playgroud)

  • `init()在main之前运行(所有这些 - 你可以在你的模块中的每个文件中都有init,甚至可以在同一个文件中有多个`init`."init"的执行顺序是未定义的,所以不要调用`flag.Parse`在他们里面).Init函数有另一个限制 - 由它们启动的goroutines在main启动之前不会启动.`init`中的变量不与其他函数共享,`strFlag`只是全局变量. (8认同)
  • 是的,这是首选方式.另一个不错的技巧是,您可以以更易维护的方式使用*any*模块拆分模块特定标志中的标志模块 (5认同)