Go Plugin介紹


以下內容來自官方文檔

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: MonsterMeng92



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM