首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

插件 | plugin

  • import "plugin"
  • 概观
  • 索引

概观

Package 插件实现 Go 插件的加载和符号解析。

一个插件是一个带有导出函数和变量的 Go 主包,这些函数和变量已经被构建:

代码语言:javascript
复制
go build -buildmode=plugin

首次打开插件时,将调用尚未包含在程序中的所有程序包的初始化函数。主要功能不运行。插件只能初始化一次,并且不能关闭。

插件支持目前不完整,仅支持Linux,并且有已知的错误。请报告任何问题。

索引

  • type Plugin
  • func Open(path string) (*Plugin, error)
  • func (p *Plugin) Lookup(symName string) (Symbol, error)
  • type Symbol

打包文件

插件是一个加载的 Go 插件。

代码语言:javascript
复制
type Plugin struct {
        // contains filtered or unexported fields
}
代码语言:javascript
复制
func Open(path string) (*Plugin, error)

Open 打开一个 Go 插件。如果路径已被打开,则返回现有的*插件。由多个 goroutines 并行使用是安全的。

func (*Plugin) Lookup(显示源文件)

代码语言:javascript
复制
func (p *Plugin) Lookup(symName string) (Symbol, error)

查找在插件 p 中搜索名为 symName 的符号。符号是任何导出的变量或函数。如果找不到该符号,它会报告错误。由多个 goroutines 并行使用是安全的。

符号是指向变量或函数的指针。

例如,一个定义为的插件

代码语言:javascript
复制
package main

import "fmt"

var V int

func F() { fmt.Printf("Hello, number %d\n", V) }

可以加载 Open 函数,然后可以访问导出的包符号 V 和 F .

代码语言:javascript
复制
p, err := plugin.Open("plugin_name.so")
if err != nil {
	panic(err)
}
v, err := p.Lookup("V")
if err != nil {
	panic(err)
}
f, err := p.Lookup("F")
if err != nil {
	panic(err)
}
*v.(*int) = 7
f.(func())() // prints "Hello, number 7"
代码语言:javascript
复制
type Symbol interface{}

扫码关注腾讯云开发者

领取腾讯云代金券