以下内容来自官方文档

go version: 1.17.5

综述

plugin包实现了Go插件的加载和符号解析。

Go插件是一个包括了可导出函数和变量的main包(可以没有main()函数),构建时使用如下命令:

go build -buildmode=plugin

插件应该在程序的init函数中调用,且应该最先调用。插件只会被初始化一次,且无法被关闭。

当前插件只支持Linux、FreeBSD和macOS。

详细介绍

plugin包中只包含两个结构:PluginSymbol

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.goplugin_dlopen.goplugin_stubs.goplugin_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: mengbin92
Github: mengbin92
cnblogs: 恋水无意