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

标签 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
}

包配置和文件配置.go 所以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
}

After compilation I get error: Cannot open log file error:open /defaultpath/config.gcfg: no such file or directory. Program was terminated.

如上所示,main 中的已解析标志在包配置中不可见,因为配置模块尝试以默认路径启动,也没有形成参数 cmd 行。这就是为什么这一定是完成错误,因为我的本地计算机中不存在此路径

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

最佳答案

configuration 中的init()main 中的anything 执行之前运行,所以没有办法可以看到 flag.Parse() 的效果。您还需要在调用 flag.Parse()

之前声明标志变量

你不能从 main 导出任何东西,因为 main 不能被导入,而且你不能在包之间有循环依赖。让 main 包调用配置包中的函数以获得您想要的行为。

您可以在 configuration 中添加导出的 Init() 函数来处理标志选项:

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

关于go - 如何在其他包中获取标志参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40044541/

相关文章:

go - 如何在 Go 中设置进程标题?

php - 解密在 GOLang 上用 PHP 解密的 AES-CBC-256 Mcrypt_RIJNDAEL

pointers - 在 Golang 中返回文件指针

algorithm - 霍尔的分区方案golang

go - 添加 gokogiri 依赖导致 `Killed: 9` 退出

docker - 使用 Dockerfile 时找不到二进制文件

Go 语言中指向结构的指针

go install 不创建包的二进制文件,而 go get 能够

for-loop - 如何在Go中遍历循环并打印出每三个元素

go - 即使关闭, channel 也不会消亡