Golang Go语言如何实现插件功能

发布于 1周前 作者 wuwangju 来自 Go语言

Golang Go语言如何实现插件功能

场景如下:
已经编译好主程序。main.exe. 解析不同文件的。
后来有了新格式文件,编写了新的解析插件:plug1.exe.main.exe 根据获取的参数调用 plug1.exe 解析。

上面这样是目前想到的,有常规合理的解决办法吗?

11 回复

你想问 Go 能不能使用动态链接库吧?据我所知貌似不能。

但应该有办法,例如 plug1.exe 实现 unix socket 接口,然后 main.exe 去调。

更多关于Golang Go语言如何实现插件功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go 是可以编译和调用链接库的 动态 /静态
但是只能在 unix 系上用,比如 linux 和 macOS,可以编译成.so 文件,不能编译成 dll

go build -buildmode=plugin plugin.go

具体代码可以搜索,很多参考资料

提供一个思路,用 lua 来实现解析的操作

以后有没有可能支持 dll ?

那样又多了一个技术栈了

不过比我想的方法好点

hashicorp/go-plugin 可以看一下

Go 暂时没有后续支持动态链接库,最好也不要用这种方式。

go build -buildmode=c-shared

在Go语言中,实现插件功能通常依赖于Go的插件包(plugin),它允许动态加载共享库(.so文件,在Windows上是.dll文件)。以下是实现插件功能的基本步骤:

  1. 编写插件代码: 创建一个新的Go文件,定义你想作为插件导出的函数、类型或变量。使用//export注释来标记这些符号,然后使用build -buildmode=plugin命令编译这个文件,生成一个插件文件。

  2. 在主程序中加载插件: 在你的主Go程序中,使用plugin包来加载编译好的插件文件。通过调用plugin.Open函数加载插件,然后使用plugin.Lookup来查找插件中导出的符号,最后进行类型转换并调用。

  3. 处理插件错误: 加载和查找插件时可能会遇到错误,例如插件文件不存在、符号未找到等。因此,需要添加适当的错误处理逻辑来确保程序的健壮性。

  4. 注意事项

    • 插件和主程序必须使用相同的Go版本编译。
    • 插件中的初始化代码(如init函数)在插件加载时不会自动执行。
    • 插件功能受限于Go的运行时环境,某些操作(如启动新的goroutine)可能需要特别小心处理。

通过以上步骤,你可以在Go语言中实现插件功能,从而在不修改主程序代码的情况下扩展其功能。这种机制非常适合需要高度模块化或动态加载功能的场景。

回到顶部