其他分享
首页 > 其他分享> > golang 1.18 plugin 经验总结

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. 总结

我希望您记下的关键要点:

代码和资料

标签:插件,plugin,1.18,golang,so,https,Go,加载
来源: https://www.cnblogs.com/ayanmw/p/16322799.html