【问题标题】:How to share variables across packages in go-lang如何在 go-lang 中跨包共享变量
【发布时间】:2016-01-03 10:18:09
【问题描述】:

我编写了一个简单的 go 应用程序并将其格式化为几个包。

+main
+controllers
+handlers
+commons
+utils

我在主包中启动服务器并在启动时读取服务器特定参数。

我不会使用那些参数,例如来自 commons 包的 DB 属性。我无法将主包导入公共,因为公共是对控制器的依赖,处理程序是对主的依赖。所以这会导致循环导入。

我们应该如何处理这种情况?是否可以读取一次配置并在需要时在 commons 包中引用它?示例会有所帮助。

【问题讨论】:

  • 选择一个不导入其他包的包,这样你的所有包都可以导入它。并将共享变量放入其中。 main 包也可以访问它来存储启动时读取的参数。
  • 您可能不应该为单个 go 应用程序拥有那么多单独的包。多年来,Go 社区对此有很多讨论,但对于一个具有主要包 main 的二进制文件,您可能会更好,只分离出您显然希望在不同项目中重用的其他包。在这一点上还有一些discussion
  • 假设您遵循 AndrewN 的建议 (KISS),并且暂时避免使用额外的包结构,您可以使用 flag 包从命令行读取参数吗?这似乎可以解决所描述的问题。 AFAIK,标志包可以从任何包中调用(不是很可爱吗?),而不仅仅是主包,所以如果参数在共享包中而不是主包中很重要,那么从那里开始工作。
  • ... 或者,您可以从环境os.Environ() 中读取参数吗?同样,它们可以从任何包中读取。
  • 一旦我们有许多配置,从 flag 或 os.Environ() 读取参数将无法扩展。我现在使用的是一个 config.yaml 并使用 viper 来读取它们。

标签: go


【解决方案1】:

您可以使用配置包,当您需要使用配置变量时,您可以将另一个结构发送到不同的包中。

main() {
    config := config{}
    user = NewUser(config)
    ...
}

我建议您检查 config revel 包 (https://github.com/revel/config)。它被用于 revel 框架https://github.com/revel/revel

【讨论】:

  • 狂欢是否解决了一个不同的、更复杂的问题?仅仅因为有“大锤”,我们就不需要使用它:-)
猜你喜欢
  • 1970-01-01
  • 2014-05-09
  • 2022-11-18
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多