在golang中标记命令行解析

30

我不确定我理解这个例子的推理(摘自这里),也不知道它想要传达关于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的新手,所以只是试图熟悉这种语言。


3
https://gobyexample.com/command-line-flags 是一个很好的例子。 - elithrar
如果您想在程序代码f.Parse([]string{"-bool", "-int", "100"})中传递参数,则需要使用FlagSet。全局的flag.Parse()函数不接受解析参数。此代码示例可以在Go代码编辑器中运行,其中无法提供命令行参数。 - chmike
1个回答

57

这是一个使用flag包的复杂示例。通常情况下,标志(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)
}       

5
是的,这是首选方式。另一个好的技巧是,你可以从任何模块使用flag模块,在更易于维护的方式下分割特定于模块的标志。 - fabrizioM
那么 init() 总是在 main() 之前运行,它的变量可以在 main 中访问吗?此外,strFlag 是一个指针,因此使用 * 来检索值? - lollercoaster
@fabrizioM:来自任何模块?确切意思是什么?因为我有Python背景,所以似乎你的意思是我们从项目中导入的其他文件也可以使用相同的标志变量?那将是一件很酷的事情。 - lollercoaster
1
@lollercoaster,是的,尝试将标志放在不是主要模块的模块内。请记住,如果您想从模块外部访问这些变量,它们需要大写。 - fabrizioM
8
所有的 init() 函数都会在 main() 函数之前运行(你可以在模块的每个文件中都有 init(),甚至在同一个文件中有多个 init()。但是请注意,init() 的执行顺序是未定义的,因此不要在其中调用 flag.Parse())。init() 函数还有另一个限制——它们启动的 goroutine 在 main() 开始之前不会启动。init() 中的变量与其他函数不共享,strFlag 仅为全局变量。 - mechmind
1
@mechmind,“甚至在同一文件中有多个初始化”,你是什么意思?能否举个例子呢? - Ian Lewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接