Typesetting math: 100%

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


posted @   落雷  阅读(955)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示