如何在go lang中跨包共享变量

如何在go lang中跨包共享变量,go,Go,我已经编写了一个简单的go应用程序,并将其格式化为几个包 +main +controllers +handlers +commons +utils 我在主包中启动服务器,并在启动时读取特定于服务器的参数 我不想使用这些参数,比如commons包中的DB属性。我无法将main包导入commons,因为commons依赖于控制器,而Handler依赖于main。这就导致了循环导入 我们应该如何处理这种情况?。是否可以读取一次配置并在需要时在commons包中引用它?示例会很有帮助。您可以使用配置包

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

+main
+controllers
+handlers
+commons
+utils
我在主包中启动服务器,并在启动时读取特定于服务器的参数

我不想使用这些参数,比如commons包中的DB属性。我无法将main包导入commons,因为commons依赖于控制器,而Handler依赖于main。这就导致了循环导入


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

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

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

我建议您检查config revel包()。它被用于revel framework。

选择一个不导入其他包的包,这样所有包都可以导入它。并将共享变量放入其中。而
main
包也可以访问它来存储启动时读取的参数。对于一个go应用程序,可能不应该有那么多单独的包。这些年来,围棋社区中有很多关于这方面的讨论,但是对于一个二进制软件来说,你可能会更好,因为它有一个主要的包,只分离出你显然希望在不同项目中重用的其他包。下面是关于这一点的进一步说明。假设您遵循AndrewN的建议(KISS),并且暂时避免额外的包结构,那么您可以使用flag包从命令行读取参数吗?这似乎可以解决所描述的问题。好的,flag包可以从任何包(不是很可爱吗?)调用,而不仅仅是main,所以如果关键是参数在共享包中,而不是main中,那么就从那里开始工作。。。。或者,您可以从environment
os.Environ()
读取参数吗?同样,它们可以从任何包中读取。一旦我们有了许多配置,从flag或os.Environ()读取参数将不可伸缩。我现在使用的是config.yaml,并使用viper读取它们。revel是否解决了另一个更复杂的问题?就因为有“大锤”,我们就不需要使用它:-)