登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-02 21:00:34 203浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《如何使用编译时未知的结构处理 JSON 插件配置》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我正在使用一个基于 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 生成配置结构体的代码,并生成相应的 if config.someplugin { } 语句。虽然这甚至可能具有良好的性能,因为没有使用动态查找,但我仍然仅限于提前了解所有插件。如果是这种情况,您是否同意这种方法是一种有效的方法?

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


解决方案


您有两个选择:

  1. 解组为通用类型,例如 map[string]interface{}
  2. 解组为 json.RawMessage

无论哪种情况,您都可以在加载数据后将该数据传递给插件,以进行完整的解组/转换。

好了,本文到此结束,带大家了解了《如何使用编译时未知的结构处理 JSON 插件配置》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>