gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:40 25 4
gpt4 key购买 nike

我有以下插件:

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 ,这只是一个空接口(interface)。为了使用它,您需要断言您想要的类型。 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"

要在你的程序中做到这一点,创建你想要的类型,在这种情况下是一个接口(interface),因为你正在寻找一个特定的方法集(参见 "Tour of Go" section on interfaces ,尤其是隐式实现和类型断言)

这里我们在主程序中创建了 V 接口(interface)来定义我们想要的方法,而不是对从 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())
}

关于go - 调用通过插件导入的结构的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com