登录
首页 >  Golang >  Go问答

使用插件导入结构体后调用其函数

来源:stackoverflow

时间:2024-03-20 17:54:31 151浏览 收藏

在使用插件导入结构体后,若要调用其函数,需要先将插件中返回的符号类型断言为所需的类型。这可以通过创建一个接口来定义所需的方法集,然后使用类型断言将符号转换为该接口来实现。这种方法允许在应用程序中访问和调用插件中定义的结构体函数。

问题内容

我有以下插件:

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


解决方案


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,尤其是隐式实现和类型断言)

这里我们在主程序中创建 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())
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>