3 回答
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)
}
TA贡献1842条经验 获得超12个赞
您可以定义var将标志存储在单独的包中,作为导出变量,然后调用主包中的标志解析以使用该变量,如下所示:
mypackage/const.go
var (
MyExportedVar string
)
主包/main.go
func init() {
flag.StringVar(&mypackage.MyExportedVar, "flagName", "defaultValue", "usage")
flag.Parse()
}
这样,每个人都可以访问该标志,包括该包本身。
注意:这仅适用于导出的变量。
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,也可以使用。
- 3 回答
- 0 关注
- 206 浏览
添加回答
举报