【问题标题】:How to handle global state in GO如何在 GO 中处理全局状态
【发布时间】:2019-07-01 01:25:45
【问题描述】:

我最近加入了一个项目,其中有一个外部配置样式服务 - 基本上是一个使用 jsonrpc 调用的 KV 存储。

不要问它为什么在那里..

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

但是,如果不使用全局变量,我无法找到解决方案。例如,我调用一个函数从包A 获取配置,但必须导出 var 才能在其他包中使用。我最初的解决方案是使用gocache 在包中设置缓存并导出缓存访问器以具有某种类型限制。然而,这增加了复杂性,而且看起来太多了,而不仅仅是将 val 存储在导出的 var 中。

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

不胜感激如何解决此类问题的任何建议。

【问题讨论】:

  • 谁告诉你全局变量本身是坏的,或者没有任何东西必须导出是错误的。有些东西只是全局的,所以把它们塞进一个变量或者有一个导出的函数。这里没有问题。
  • 能否创建一个设置包,也可以在其他包中使用?

标签: go


【解决方案1】:

如果您的项目很小或预计不会有太大变化,那么全球 配置应该没问题。不过,我会将配置变量放在自己的包中。另一方面,如果项目预计增长超过 时间,把东西封装起来是有意义的。

您能否将配置作为参数从包A 传递给任何其他包 需要方法或构造函数参数的形式吗?我认为传递的东西 around 使得对配置的依赖变得明显,并且还允许更容易 在测试中模拟。

我个人会像这样构建项目(如果我从头开始工作 - 可能不是您拥有的奢侈品):

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.

所有配置文件都在config 包中。它可以与 JSON-RPC 对话 服务器,也许缓存结果并返回配置。 main 包 创建 config fetcher 的一个实例并将其传递给所有的实例 需要使用配置。

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 2021-07-27
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2010-09-07
    • 2020-08-24
    相关资源
    最近更新 更多