首页 > 解决方案 > 将通道参数传递给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
来自模块符号的意外类型

标签: goplugins

解决方案


如果你还在学习 golang,那么插件绝对不是开始的地方。我相信插件支持仍处于试验阶段,并不适用于所有操作系统 - 在 1.10 中,我相信 Darwin 已添加到以前的 Linux 中。

快速搜索会发现一个与您的报告类似的预先存在的问题 - 看起来它在 go 1.10 中: https ://github.com/golang/go/issues/24351

您也许可以跟踪存储库并获取已修复此问题的分支或版本,但是在您学习的同时,您不会对这个功能领域的问题是否与您的代码或插件系统有关。因此,我建议现在坚持学习核心语言功能。


推荐阅读