gpt4 book ai didi

go - 如何使用编译时未知的结构处理JSON插件配置

转载 作者:行者123 更新时间:2023-12-01 21:23:25 26 4
gpt4 key购买 nike

我正在使用基于Go的软件,该软件允许使用多个插件。

  • 插件不能使用两次(通过选择)=>启用或禁用了一个插件
  • 插件名称是唯一的
  • 所有插件都配置了特定于插件的配置,定义为JSON可序列化的结构

  • 插件的使用通过单个配置进行控制。考虑以下配置结构的简化示例:
    type PluginConfig struct {
    PluginA *PluginA `json:"pluginA,omitEmpty"`
    PluginB *PluginB `json:"pluginB,omitEmpty"`
    PluginC *PluginC `json:"pluginC,omitEmpty"`
    PluginD *PluginD `json:"pluginD,omitEmpty"`
    }

    在代码中的某处,将检查每个字段,如果提供了配置,则会添加实际的插件:
    if config.PluginA != nil {
    AddPlugin(plugina.New(config.PluginA))
    }
    if config.PluginB != nil {
    AddPlugin(pluginb.New(config.PluginB))
    }
    // ...

    我正在尝试对软件进行返工,因此也支持外部插件。该软件仍必须像以前一样运行,因此不能更改格式和配置方式。另外,我需要使用默认的 encoding/json包来解码配置。

    如果我在编译时知道所有插件,则可以在编译之前 go generate配置结构的代码,并生成相应的 if config.SomePlugin { }语句。尽管由于不使用动态查找,这甚至可能具有良好的性能,但我仍然仅限于事先了解所有插件。如果是这样,您是否同意这种方法是行之有效的方法?

    如果我只能在运行时获得插件列表,该怎么办?那我该如何处理配置文件,所以不仅插件名称是动态的,而且我以前也不知 Prop 体的配置?

    最佳答案

    您有两种选择:

  • 解码为诸如map[string]interface{}的通用类型
  • 解编为json.RawMessage

  • 无论哪种情况,您都可以在加载后将数据传递给插件,以进行完全的编码/转换。

    关于go - 如何使用编译时未知的结构处理JSON插件配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58745990/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com