如何访问主包外的标志?

时间:2014-10-23 21:29:41

标签: go flags

当然,主要包中的main.go中有parse flagsflags.Args()。然后我们有另一个包,我们想要读取一些标志的值。

{{3}}工作正常,它将返回所有非标志值。

但我无法弄清楚如何读取已经解析的除了main之外的包中的标志的值。

有可能吗?

由于

阿梅尔

4 个答案:

答案 0 :(得分:10)

我最近有同样的要求,我想要一个避免在flag.Parse函数中反复调用init的解决方案。

仔细阅读我发现的flag个包Lookup(name string),其中包含Flag Value。每个内置的Value都实现了flag.Getter接口。调用链看起来像这样:

flag.Lookup("httplog").Value.(flag.Getter).Get().(bool)

如果您错误输入标记名称或使用错误的类型,则会出现运行时错误。我将查找包装在一个函数中,我直接在需要的地方调用,因为查找和get方法很快,而且函数不经常调用。所以主包声明了标志。

// main.go
package main

import "flag"

var httplog = flag.Bool("httplog", false, "Log every HTTP request and response.")

func main() {
    flag.Parse()
    // ...
}

除了标志名称之外,与main解耦的实用程序包读取标志值。

// httpdiag.go
package utility

import "flag"

func logging() bool {
    return flag.Lookup("httplog").Value.(flag.Getter).Get().(bool)
}

答案 1 :(得分:2)

您可以在该包中定义标记,并在flag.Parse()中调用func init()flag.Parse可以多次调用。

但是,如果您想要从多个包中访问该标志的值,您必须公开它或创建一个公开的函数来检查它。

例如:

// pkgA
var A  = flag.Bool("a", false, "why a?")

func init() {
    flag.Parse()
}

// main package
func main() {
    flag.Parse()
    if *pkgA.A {
        // stuff
    }
}

如果你想重新解析args,你也可以使用FlagSet.Parse(os.Args)

答案 2 :(得分:2)

您可以将单独包中存储标志的var定义为导出变量,然后调用主包中的标志解析来使用该变量,如下所示:

<强> mypackage的/ const.go

var (
    MyExportedVar string
)

<强> mainpackage / main.go

func init() {
    flag.StringVar(&mypackage.MyExportedVar, "flagName", "defaultValue", "usage")

    flag.Parse()
}

这样,每个人都可以访问该标志,包括该包本身。

注意:  这仅适用于导出的变量。

答案 3 :(得分:-2)

解析标志时,将它们解析为全局变量,这些变量以初始Capital开头,因此它们是公共的,例如

package main

var Species = flag.String("species", "gopher", "the species we are studying")

func main() {
    flag.Parse()
}

然后在您的其他包中,您可以将它们称为

package other

import "/path/to/package/main"

func Whatever() {
    fmt.Println(main.Species)
}