如何访问主包之外的标志?

当然,我们在 main 包中的 main.go 中解析标志。然后我们有另一个包,我们想在其中读取一些标志的值。

flags.Args()工作正常,它将返回所有非标志值。

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

有可能吗?

谢谢


至尊宝的传说
浏览 207回答 3
3回答

烙印99

我最近有同样的需求,我想要一个避免flag.Parse在init函数中重复调用的解决方案。仔细阅读我发现的标志包Lookup(name string),它返回一个具有Value的标志。每个内置的 Value 都实现了接口。调用链如下所示:flag.Getterflag.Lookup("httplog").Value.(flag.Getter).Get().(bool)如果您输入错误的标志名称或使用错误的类型,则会出现运行时错误。我将查找包装在一个函数中,我在需要时直接调用该函数,因为查找和获取方法很快,并且该函数不经常调用。所以主包声明了标志。// main.gopackage mainimport "flag"var httplog = flag.Bool("httplog", false, "Log every HTTP request and response.")func main() {    flag.Parse()    // ...}实用程序包除了标志名外与 main 解耦,读取标志值。// httpdiag.gopackage utilityimport "flag"func logging() bool {    return flag.Lookup("httplog").Value.(flag.Getter).Get().(bool)}

红颜莎娜

您可以定义var将标志存储在单独的包中,作为导出变量,然后调用主包中的标志解析以使用该变量,如下所示:mypackage/const.govar (    MyExportedVar string)主包/main.gofunc init() {    flag.StringVar(&mypackage.MyExportedVar, "flagName", "defaultValue", "usage")    flag.Parse()}这样,每个人都可以访问该标志,包括该包本身。注意:这仅适用于导出的变量。

喵喵时光机

您可以在包中定义的标志,并呼吁flag.Parse()在func init(),flag.Parse可以多次调用。但是,如果您想从多个包访问标志的值,您必须公开它或创建一个公开的函数来检查它。例如:// pkgAvar A  = flag.Bool("a", false, "why a?")func init() {    flag.Parse()}// main packagefunc main() {    flag.Parse()    if *pkgA.A {        // stuff    }}FlagSet.Parse(os.Args)如果您想重新解析 args,也可以使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go