通过插件导入的结构的调用函数

时间:2018-12-05 18:32:24

标签: go

我有以下插件:

package main

type Test struct {
    Id string
}

func (test *Test) GetId() string {
    return test.Id
}

var V Test

我正在将其导入我的应用程序中:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("test.so")
    if err != nil {
        panic(err)
    }
    v, err := p.Lookup("V")
    if err != nil {
        panic(err)
    }

    fmt.Println(v)
}

不幸的是,我无法在其上调用v.getId()-有没有办法公开给定结构上设置的所有函数?

1 个答案:

答案 0 :(得分:1)

Lookup返回一个Symbol,它只是一个空接口。为了使用它,您需要声明所需的类型。 Symbol示例的文档显示了两个声明为预期类型的​​符号:

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"

要在程序中执行此操作,请创建所需的类型,在这种情况下,该类型为接口,因为您要查找特定的方法集(请参见"Tour of Go" section on interfaces,esp隐式实现和类型断言)< / p>

在这里,我们在主程序中创建V接口以定义所需的方法,而不是对从Lookup返回的符号使用类型断言:

type V interface {
    GetId() string
}

func main() {
    p, err := plugin.Open("plugin.so")
    if err != nil {
        panic(err)
    }

    s, err := p.Lookup("V")
    if err != nil {
        panic(err)
    }

    v := s.(V)

    fmt.Println(v.GetId())
}