相关疑难解决方法(0)

Go插件依赖项如何工作?

Go 1.8支持Go插件。

我创建了两个插件,如下所示。

据我了解,该插件仅公开main包中的函数和变量。即plugin.Lookup()对于非main变量/函数将失败。

但是我想测试一个插件是否可以在内部从另一个插件调用方法,类似于C ++库如何调用另一个库。

所以我测试如下:

plugin1 github.com/vimal/testplugin

$ cat myplugin.go
package main

import "C"
import "fmt"
import help "github.com/vimal/testplugin1/plug"

func init() {
        fmt.Printf("main.init invoked\n")
}
// TestPlugin 
func TestPlugin() string {
        return help.Help()
}
Run Code Online (Sandbox Code Playgroud)

plugin2 github.com/vimal/testplugin1

$ cat myplugin.go
package main

import "C"

func HelperFunc() string {
        return "help"
}
$ cat plug/helper.go
package help

func Help() string {
        return "help234"
}
Run Code Online (Sandbox Code Playgroud)

这里的想法是,plugin1调用plugin2的内部非main功能。

主程序

主程序加载作为参数给定的许多插件,并TestPlugin()从最后一个插件调用。

测试1:

构建两个插件,加载两个插件,然后调用invoke TestPlugin() …

plugins dependencies go

5
推荐指数
1
解决办法
1029
查看次数

是否可以在 go 插件和应用程序之间共享自定义数据类型?

我知道可以查找导出的 go-plugin 符号并将它们键入 assert 到interface 中。但是,我想知道是否有办法将它们输入到结构中,例如。有没有办法做到这一点?

例如:

插件

package main

type Person struct {
    Name string
}

var (
    P = Person{
        Name: "Emma",
    }
)
Run Code Online (Sandbox Code Playgroud)

应用程序

package main

import (
    "fmt"
    "plugin"
    "os"
)

func main() {
    plug, err := plugin.Open("./plugin.so")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    sym, err := plug.Lookup("P")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    var p Person
    p, ok := sym.(Person)
    if !ok {
        fmt.Println("Wrong symbol type")
        os.Exit(1)
    }

    fmt.Println(p.Name) …
Run Code Online (Sandbox Code Playgroud)

plugins go

4
推荐指数
1
解决办法
755
查看次数

标签 统计

go ×2

plugins ×2

dependencies ×1