为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
哈士奇WWW 2023-05-15 14:38:50
我有一个以下插件:package maintype Test struct {    Id string}func (test *Test) GetId() string {    return test.Id}var V Test我在我的应用程序中导入它:package mainimport (    "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 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

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) = 7

f.(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())

}


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信