🐍 为什么从 Go 重构为 Python?
Go 的 plugin 包不适合热插拔场景。.so 文件与主程序是独立编译单元,类型不共享,依赖注入后接口不匹配会导致 panic。Python 的动态特性天然适合插件化架构。
技术对比
| 问题 | Go 方案 | Python 方案 |
|---|---|---|
| 插件热插拔 | plugin.Open(".so") | importlib 动态加载 .py |
| 依赖注入 | 反射注入,类型不匹配 → panic | 直接传 dict/对象,无编译隔离 |
| 开发效率 | 每次改插件需重新编译 | 改完即生效,零编译 |
| 配置类型 | map[string]string 限制 | dict[str, Any] 原生支持任意类型 |
Go 插件系统的致命问题
Go 的插件机制依赖 plugin.Open() 加载编译好的 .so 文件。每个 .so 是独立的编译单元,无法共享类型定义。这意味着插件中定义的接口与框架中的接口即使签名相同,也被视为不同类型,导致依赖注入后接口为 nil,运行时直接 panic。
Python 的优势
- 动态类型 — 没有编译时类型检查,插件直接使用框架定义的类型
- importlib — 运行时动态加载
.py文件,零编译开销 - 类型共享 — 插件通过
from oss.plugin.types import Plugin直接引用框架类型 - 开发迭代快 — 改完代码即生效,无需重新编译