如何在其他包中获取标志参数

时间:2016-10-14 13:35:58

标签: go

我在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行。这就是为什么这必须是完成错误,因为这条路径不存在于我的本地机器

最后的问题是: 如何从主包导出标志变量到其他自己的包?

1 个答案:

答案 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()
}