Golang Go语言如何实现插件功能
Golang Go语言如何实现插件功能
场景如下:
已经编译好主程序。main.exe. 解析不同文件的。
后来有了新格式文件,编写了新的解析插件:plug1.exe.main.exe 根据获取的参数调用 plug1.exe 解析。
上面这样是目前想到的,有常规合理的解决办法吗?
你想问 Go 能不能使用动态链接库吧?据我所知貌似不能。
但应该有办法,例如 plug1.exe 实现 unix socket 接口,然后 main.exe 去调。
更多关于Golang Go语言如何实现插件功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢
提供一个思路,用 lua 来实现解析的操作
以后有没有可能支持 dll ?
那样又多了一个技术栈了
不过比我想的方法好点
hashicorp/go-plugin 可以看一下
Go 暂时没有后续支持动态链接库,最好也不要用这种方式。
go build -buildmode=c-shared
在Go语言中,实现插件功能通常依赖于Go的插件包(plugin
),它允许动态加载共享库(.so文件,在Windows上是.dll文件)。以下是实现插件功能的基本步骤:
-
编写插件代码: 创建一个新的Go文件,定义你想作为插件导出的函数、类型或变量。使用
//export
注释来标记这些符号,然后使用build -buildmode=plugin
命令编译这个文件,生成一个插件文件。 -
在主程序中加载插件: 在你的主Go程序中,使用
plugin
包来加载编译好的插件文件。通过调用plugin.Open
函数加载插件,然后使用plugin.Lookup
来查找插件中导出的符号,最后进行类型转换并调用。 -
处理插件错误: 加载和查找插件时可能会遇到错误,例如插件文件不存在、符号未找到等。因此,需要添加适当的错误处理逻辑来确保程序的健壮性。
-
注意事项:
- 插件和主程序必须使用相同的Go版本编译。
- 插件中的初始化代码(如
init
函数)在插件加载时不会自动执行。 - 插件功能受限于Go的运行时环境,某些操作(如启动新的goroutine)可能需要特别小心处理。
通过以上步骤,你可以在Go语言中实现插件功能,从而在不修改主程序代码的情况下扩展其功能。这种机制非常适合需要高度模块化或动态加载功能的场景。