美文网首页
Golang标准库——plugin

Golang标准库——plugin

作者: DevilRoshan | 来源:发表于2020-10-18 02:06 被阅读0次

    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"
    

    相关文章

      网友评论

          本文标题:Golang标准库——plugin

          本文链接:https://www.haomeiwen.com/subject/iyhxmktx.html