【发布时间】: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