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 @   落雷  阅读(953)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
点击右上角即可分享
微信分享提示