go - 将通道参数传递给golang中的动态加载函数
问题描述
我是 golang 和 golang 插件的新手。我无法将 chan 对象传递给此函数。如果我切换到 int 它可以工作。不知道我到底错过了什么。谢谢你的帮助。
数据单元.go
package main
type DataUnit struct {
i int
s string
}
modcounter.go
package main
import (
"fmt"
// "strconv"
)
type module string
//func (m module) RunMod(i int) {
func (m module) RunMod(in <-chan *DataUnit) {
//fmt.Println("Hello Universe " + strconv.Itoa(i))
fmt.Println("Hello Universe ")
n := <-in
fmt.Printf(n.s)
}
var Module module
modmain.go
package main
import (
"fmt"
"os"
"plugin"
)
type DataUnit struct {
i int
s string
}
type Module interface {
//RunMod(i int)
RunMod(in <-chan *DataUnit)
}
func main() {
out := make(chan *DataUnit, 2000)
plug, err := plugin.Open("./modcounter.so")
if err != nil {
fmt.Printf("FATAL (plugin.Open): " + err.Error())
os.Exit(1)
}
symModule, err := plug.Lookup("Module")
if err != nil {
fmt.Printf(err.Error())
os.Exit(1)
}
var module Module
module, ok:= symModule.(Module)
if !ok {
fmt.Println("unexpected type from module symbol")
os.Exit(1)
}
//module.RunMod(5)
module.RunMod(out)
}
go build -buildmode=plugin -o modcounter.so modcounter.go dataunit.go
go build modmain.go dataunit.go
./modmain
来自模块符号的意外类型
解决方案
如果你还在学习 golang,那么插件绝对不是开始的地方。我相信插件支持仍处于试验阶段,并不适用于所有操作系统 - 在 1.10 中,我相信 Darwin 已添加到以前的 Linux 中。
快速搜索会发现一个与您的报告类似的预先存在的问题 - 看起来它在 go 1.10 中: https ://github.com/golang/go/issues/24351
您也许可以跟踪存储库并获取已修复此问题的分支或版本,但是在您学习的同时,您不会对这个功能领域的问题是否与您的代码或插件系统有关。因此,我建议现在坚持学习核心语言功能。
推荐阅读
- javascript - 当导航为真时,在 owl carousel 1.3.3 中未触发 owl-item 上的单击事件
- c++ - 为什么这个重载的构造函数在花括号之外有它的信息并且仍然可以正常工作?
- windbg - 十六进制地址上的windbg dd命令给出????问号
- amazon-web-services - 在 AWS 中,为什么我们将 RDS 实例保留在私有子网中?
- azure - powerbi embed:无效授权:consent_required
- java - 使用 Apache Helix 时可以自定义分区名称吗?
- css - 如何不模糊边界边缘?
- javascript - 如何编写脚本以在我的邮件中发送报告
- laravel - 在laravel中将字符串日期转换为时间戳
- javascript - 如何在另一个函数中解析异步函数?