golang 1.18 plugin 经验总结
作者:互联网
golang plugin 结论:
0 ** 目前 golang1.8 以上, 现在golang1.18 ,并且类linux 费windows 平台支持golang的plugin.
1 ** 目前只能加载,不能卸载so,所以 so加载导内存后,不会卸载,无限加载so会导致内存泄露;
2 so 里面引用的其他package 和 主进程 地址相同,比如so调用了 log.SetPrefix 会导致 全局 log 发生变化;
3 ** 重新加载此plugin的方法: 把so的 main 包名的目录给改掉,比如 plugin.test/main/cmd/logic 改为 plugin.test/main/cmd/logic_v1
4 通过-ldflags="-pluginpath=$pluginpath" 的方法,目前失效,主要是 找不到符号了,那此pluginpath 也就没有意义了.
5 ** 主进程加载的so 必须保持其他包不发生任何改变, 否则会报错:plugin was built with a different version of package plugin.test/main/iface plugin5.so
6 一旦发生 5 的报错, 由于1 的原因, 即使plugin5.so 修改为正确的plugin,还是无法重新加载, 因为已经进入内存,不会再次读取本地文件了.所以只能通过3 用新的so包名
7 ** 关于闭包, 不管是函数还是struct{}, 不同包下面的 相同函数地址是不同的.所以 如果把 func() 保存起来闭包执行,请确保 从一个会改变的入口函数.
示例代码:
https://files.cnblogs.com/files/ayanmw/plugin_reload_test-ayanmw.zip?t=1653778991
参考链接:
https://toutiao.io/posts/dwyqix/preview #这个plugin热加载方案不行的, 貌似 也就是 go1.8到 Go 1.10之前 才可以用.
https://colobu.com/2017/08/26/panic-on-go-plugin-Open-for-different-plugins/ #同上
https://golang.google.cn/pkg/plugin/#pkg-overview
https://cloud.tencent.com/developer/article/1914954 #Golang: 插件plugin介绍 GoodDoctor
5.1 Go版本兼容问题
插件实现和主应用程序都必须使用完全相同的Go工具链版本构建. 由于插件提供的代码将与主代码在相同的进程空间中运行, 因此编译的二进制文件应与主应用程序 100%兼容.
6. 总结
我希望您记下的关键要点:
- 1.Go插件从v1.8版本开始支持,它目前支持Linux和Mac操作系统(不支持windows)
- 2.Go plugin包提供了一个简单的函数集动态加载,可以帮助开发人员编写可扩展的代码.
- 3.Go插件是使用
go build -buildmode = plugin
构建标志编译 - 4.Go插件包中的导出函数和公开变量,可以使用插件包在运行时查找并绑定调用.
- 5.Go runtime import插件的开发人员必须将插件视为黑盒子,做好各种最坏的假设
代码和资料
标签:插件,plugin,1.18,golang,so,https,Go,加载 来源: https://www.cnblogs.com/ayanmw/p/16322799.html