以下內容來自官方文檔。
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