Go Plugin介绍
以下内容来自官方文档。
go version: 1.17.5
综述
plugin包实现了Go插件的加载和符号解析。
Go插件是一个包括了可导出函数和变量的main包(可以没有main()函数),构建时使用如下命令:
go build -buildmode=plugin
插件应该在程序的init函数中调用,且应该最先调用。插件只会被初始化一次,且无法被关闭。
当前插件只支持Linux、FreeBSD和macOS。
详细介绍
plugin包中只包含两个结构:Plugin和Symbol。
Plugin
plugin即为导入的插件。plugin包提供了两个方法:
- func Open(path string) (*Plugin, error)
加载Go插件。如果path指定的插件已经加载过,将返回已存在的 *Plugin。该方法可在goroutines安全使用。 - func (p *Plugin) Lookup(symName string) (Symbol, error)
Lookup在插件p中查找名为symName的符号。符号可以是变量或者函数。符号不存在,则报错。该方法可在goroutines安全使用。
Symbol
Symbol是指针类型,可以是变量指针,也可以是函数指针。
扩展
plugin包中包含4个文件,plugin.go、plugin_dlopen.go、plugin_stubs.go和plugin_test.go,实现功能的是以下两个文件:
- plugin.go 定义前一小节介绍的数据结构和函数
- plugin_dlopen.go 实现接口
查看plugin_dlopen.go源码,不难发现Go插件功能的实现实际是依赖于C语言中对动态库的解析,所以使用plugin时,需设置CGO_ENABLED=1,否则plugin将无法使用。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: MonsterMeng92