为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
至尊宝的传说 2021-08-23 17:19:07
当然,我们在 main 包中的 main.go 中解析标志。然后我们有另一个包,我们想在其中读取一些标志的值。flags.Args()工作正常,它将返回所有非标志值。但是我无法弄清楚如何读取除 main 之外的包中标志的已解析值。有可能吗?谢谢
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

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


仔细阅读我发现的标志包Lookup(name string),它返回一个具有Value的标志。每个内置的 Value 都实现了接口。调用链如下所示:flag.Getter


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

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


// 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)

}


查看完整回答
反对 回复 2021-08-23
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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


mypackage/const.go


var (

    MyExportedVar string

)

主包/main.go


func init() {

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


    flag.Parse()

}

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


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


查看完整回答
反对 回复 2021-08-23
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您可以在包中定义的标志,并呼吁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

    }

}

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


查看完整回答
反对 回复 2021-08-23
  • 3 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信