我在go中编写程序,并且使用包 flag 在其他自己的包中获取变量表单命令行时遇到问题。
flag.Parse()
主要问题在于配置包,因为我在很多地方多次使用她,所以我想避免将pionter传递给她,我决定创建一个独立的模块。现在我遇到了使用配置获取pathFile标志的问题。我的代码如下所示
我用参数
运行我的程序program -config = / my / path / config.cfg
和主要功能
func main() {
flag.Parse()
// some next operation but not with configuration Type
// the type of configuration is use in other object
//and in other place in my program
// here I only want to parse plag from
// cmd lines
}
包配置和文件配置。所以 configuration / configuration.go
var (
configPath string
C *configuration
)
func init() {
flag.StringVar(&configPath,
"config",
"/defaultpath/config.gcfg",
"Path to configuration file")
C = &configuration{}
if err := gcfg.ReadFileInto(C, configPath); err != nil {
fmt.Printf("Cannot read configuration file. Program was Terminated error:%s", err)
os.Exit(1)
}
}
type configuration struct {
Queue struct {
User string
Host string
Port string
}
编译后我收到错误:无法打开日志文件错误:打开 /defaultpath/config.gcfg:没有这样的文件或目录。计划是 终止。
如上所示,在包配置中看不到main中的Parsed标志,因为配置模块尝试以默认路径启动,也不使用表单参数cmd行。这就是为什么这必须是完成错误,因为这条路径不存在于我的本地机器
中最后的问题是: 如何从主包导出标志变量到其他自己的包?
答案 0 :(得分:2)
init()
中的configuration
在执行main
中的任何之前运行,因此无法看到flag.Parse()
的效果。在调用flag.Parse()
您无法从main
导出任何内容,因为无法导入main
,并且因为您不能在这些包之间存在循环依赖关系。让main
包调用配置包中的函数以获得所需的行为。
您可以在Init()
中添加导出的configuration
函数来处理标记选项:
func Init() {
flag.StringVar(&configPath,
"config",
"/defaultpath/config.gcfg",
"Path to configuration file")
flag.Parse()
C = &configuration{}
if err := gcfg.ReadFileInto(C, configPath); err != nil {
fmt.Printf("Cannot read configuration file. Program was Terminated error:%s", err)
os.Exit(1)
}
}
并让main
函数以
func main() {
configuration.Init()
}