如何在GO中处理全局状态

时间:2018-08-31 11:45:14

标签: go

我最近加入了一个项目(初级),那里有一个外部配置样式服务-基本上是一个用jsonrpc调用的KV商店。

不要问它为什么在那里。

我需要查询此配置服务以获得代码库内部使用的白名单。

但是,如果不使用全局变量,就无法找到解决方案。例如,我调用一个函数从软件包num.reframe()获取配置,但必须导出var以便在其他软件包中使用。我最初的解决方案是使用A设置程序包中的缓存,并导出缓存访问器以进行某种类型限制。但是,这增加了复杂性,而且似乎不仅仅是将val存储在导出的var中。

我已经看到标准库中使用了全局变量,但是感到困惑,因为这将违反封装法则?

将感谢您提供任何有关解决此类问题的建议。

1 个答案:

答案 0 :(得分:2)

如果您的项目规模较小或预计不会有太大变化,那么全球 配置可能还可以。不过,我会将config变量放在自己的程序包中。另一方面,如果预期该项目会结束 时间,将事物封装起来很有意义。

您能否将配置作为参数从软件包get_terms('my_taxonomy')传递到任何其他软件包 需要方法或构造函数args的形式吗?我认为传递事物 周围使对配置的依赖性显而易见,也使操作更容易 在测试中模拟。

我个人会这样构造项目(如果我是从头开始的, 可能不是您所拥有的奢侈品):

A

所有配置资料都在project root | |- config/ | |- Config (interface) -> knows how to fetch config form JSON-RPC and caches it if necessary | | |- GetSomething1() | | |- GetSomething2() | | |- Get(key string) -> If you have arbitrary keys | | | |- NewJsonRpcConfig(settings) -> returns something that implements the Config interface | |- main.go -> calls config.NewConfig() | |- Passes the resulting Config interface as a parameter to anything that needs it. Packages don't directly interact with a global variable. 包中。它可以与JSON-RPC对话 服务器,也许缓存结果并返回配置。 config包 创建配置提取程序的实例,并将其传递给所有 需要使用配置。