2015-10-06 25 views
2

我写了一个简单的go应用程序并将其格式化为多个包。如何在程序包中共享变量go-lang

+main 
+controllers 
+handlers 
+commons 
+utils 

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

我不会使用这些参数,例如来自commons包的DB属性。我不能将主包导入到commons的原因commons是一个依赖于控制器,处理程序这是一个依赖于主。所以这会导致循环导入。

我们该如何处理这种情况呢?是否有可能只读一次配置,并在需要时在commons包内引用它?例子会很有帮助。

+2

选择一个不导入其他软件包的软件包,这样所有软件包都可以导入它。并将共享变量放入其中。而'main'软件包也可以访问它来存储启动时读取的参数。 – icza

+0

对于单个应用程序,你可能不应该拥有那么多独立的包。这些年来,在社区中一直存在很多关于此的喋喋不休,但是对于一个具有主要软件包主干的二进制文件来说,你可能会更好,只是将其他软件包分离出来,而这些软件包显然可以在不同的项目中重复使用。这里有一些进一步的讨论(https://forum.golangbridge.org/t/organizing-go-code/1110/6)。 – AndrewN

+0

假设你遵循AndrewN的建议(KISS),并且现在避免额外的包结构,你可以使用标志包从命令行读取参数吗?这似乎解决了所述的问题。 AFAIK,旗包可以从任何包中调用(不是很可爱?),而不仅仅是主要的,所以如果关键是参数在一个共享的包中,而不是主要的,那么从那里开始工作。 – gbulmer

回答

1

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

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

我推荐给你检查配置狂欢包(https://github.com/revel/config)。它被用于狂欢框架https://github.com/revel/revel

+0

是否陶醉于解决另一个更复杂的问题?只是因为有'大锤',我们不需要使用它:-) – gbulmer