概述
在 1.8 版本中开放插件(Plugin)的支持,这意味着现在能从 Go 中动态加载部分函数。
在 Go 1.8(不是 1.18)版本中,Go 引入了 plugin
包,它允许 Go 程序通过动态加载共享库(.so 文件)来扩展功能。这对于需要插件化、动态加载功能模块的场景非常有用。
plugin
基本概念:
- 共享库:是一个编译后的 Go 代码的动态库(.so 文件),可以在运行时被加载。
- 符号(Symbol):共享库中的变量和函数在加载时可以被查找并调用。
示例:如何使用 plugin
包
1. 创建插件(共享库)
首先,我们创建一个简单的 Go 文件 plugin.go
,这个文件将被编译成共享库。
1 | // plugin.go |
编译这个 Go 文件为共享库:
1 | go build -buildmode=plugin -o myplugin.so plugin.go |
2. 在主程序中使用插件
接下来,我们编写主程序来加载并使用这个插件。
1 | // main.go |
编译并运行主程序:
1 | go run main.go |
3. 运行结果
1 | Hello from the plugin! |
总结
plugin
允许在 Go 程序中动态加载和使用编译好的 Go 代码(共享库)。- 可以通过
plugin.Open()
打开.so
文件,然后通过Lookup()
查找插件中的函数和变量,并使用类型断言来调用这些符号。
这种机制非常适合需要在运行时扩展功能的应用程序,比如可插拔的应用架构、动态扩展的系统等。