Golang标准库——plugin

DevilRoshan · · 742 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

plugin

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

目前,plugin仅在Linux上有效。

plugin是Go主程序包,具有导出的函数和变量,这些函数和变量已使用以下命令构建:

go build -buildmode=plugin

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

type Plugin

type Plugin struct {
    pluginpath string
    err        string        // set if plugin failed to load
    loaded     chan struct{} // closed when loaded
    syms       map[string]interface{}
}

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

func Open

func Open(path string) (*Plugin, error)

Open打开一个Go插件。 如果已经打开路径,则返回现有的* Plugin。 对于多个goroutine并发使用是安全的。

func (*Plugin) Lookup

func (p *Plugin) Lookup(symName string) (Symbol, error)

Lookup在插件p中搜索名为symName的符号。 符号是任何导出的变量或函数。 如果找不到该符号,它将报告错误。 对于多个goroutine并发使用是安全的。

type Symbol

type Symbol interface{}

Symbol是指向变量或函数的指针。

例如,定义为

package main

// // No C code needed.
import "C"

import "fmt"

var V int

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

可以加载打开功能,然后可以访问导出的软件包符号V和F

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"

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:DevilRoshan

查看原文:Golang标准库——plugin

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

742 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传