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

我有一个以下插件:


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()它——有没有办法公开给定结构上设置的所有函数?


哈士奇WWW
浏览 90回答 1
1回答

慕容3067478

Lookup返回 a Symbol,这只是一个空接口。为了使用它,您需要断言您想要的类型。例如,文档Symbol显示了两个断言为预期类型的符号:v, err := p.Lookup("V")if err != nil {    panic(err)}f, err := p.Lookup("F")if err != nil {    panic(err)}*v.(*int) = 7f.(func())() // prints "Hello, number 7"要在你的程序中做到这一点,创建你想要的类型,在这种情况下是一个接口,因为你正在寻找一个特定的方法集(参见接口的“Tour of Go”部分,特别是隐式实现和类型断言)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())}
打开App,查看更多内容
随时随地看视频慕课网APP