我是golang和golang插件的新手。我无法将chan对象传递给此函数。如果我切换到int它工作。不确定我到底错过了什么。谢谢你的帮助。
dataunit.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
来自模块符号的意外类型
答案 0 :(得分:2)
如果你还在学习golang,那么插件肯定不是开始的地方。我相信插件支持仍然是实验性的,并不适用于所有操作系统 - 在1.10我相信Darwin被添加到以前的Linux中。
快速搜索显示报告的类似于您的预先存在的问题 - 看起来像去了1.10: https://github.com/golang/go/issues/24351
您可以跟踪存储库并获取已修复的分支或版本,但在您了解的情况下,您无法确定此功能区域的问题是否与您的代码或插件系统。因此,我建议现在坚持学习核心语言功能。
答案 1 :(得分:1)
在go中可以传递对象的通道!!
例如,如果您使用&lt; -chan http.Header 将正常工作。问题是必须在模块和应用程序之间共享参数。因此,如果您为另一个包重新分配DataUnit将起作用。
我的测试结构如下:
我的界面:
//in modmain.go
type Module interface {
RunMod(in <-chan *mydata.DataUnit)
}
我的模块:
//in modcounter.go
func (m module) RunMod(in <-chan *mydata.DataUnit) {
fmt.Println("Hello Universe ")
n := <-in
fmt.Printf("%v", n.S)
}
我的数据:
//in dataunit.go
type DataUnit struct {
I int //export field
S string //export field
}
P.S。:使用golang 1.10的Docker进行测试。
#in Dockerfile
FROM golang:1.10
COPY . /go/
RUN export GOPATH=$GOPATH:/go/
RUN cd /go/src/mydata && go build dataunit.go
RUN cd /go/src/app && go build modmain.go
RUN cd /go/src/app && go build -buildmode=plugin -o modcounter.so modcounter.go
WORKDIR /go/src/app
RUN ls -l
CMD ["/go/src/app/modmain"]