Golang标准库——plugin

2020-10-18  本文已影响0人  DevilRoshan

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"
上一篇下一篇

猜你喜欢

热点阅读