передача параметра канала динамически загружаемому функционалу в golang - PullRequest
0 голосов
/ 27 апреля 2018

Я новичок в плагинах golang и golang. У меня проблемы с передачей объекта chan для этих функций. Если я переключаюсь на int, это работает. Не уверен, что именно мне не хватает. Спасибо за любую помощь.

* ** 1002 1003 * dataunit.go * ** 1004 1005 *
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 = плагин -o modcounter.so modcounter.go dataunit.go
go build modmain.go dataunit.go

. / Modmain
неожиданный тип из символа модуля

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

В го можно пропустить каналы объектов !!

Например, если вы используете <- chan http.Header </strong> будет работать нормально. Вопрос в том, что параметры должны быть разделены между модулями и приложением. Так что если вы перераспределите DataUnit для другого пакета, будет работать.

Мой тест был структурирован как:

enter image description here

Мой интерфейс:

//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
}

Результат: enter image description here

P.S .: Для испытаний использовался докер с Голангом 1.10.

#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"]
0 голосов
/ 28 апреля 2018

Если вы все еще изучаете golang, тогда плагины - не то место, с которого нужно начинать. Я считаю, что поддержка плагинов все еще экспериментальна и не работает на всех ОС - в 1.10 я считаю, что Дарвин был добавлен в предыдущий Linux.

При быстром поиске обнаруживается уже существующая проблема, о которой сообщалось, что она похожа на вашу - похоже, что она в версии 1.10: https://github.com/golang/go/issues/24351

Возможно, вы можете отследить репозиторий и получить ветку или версию, в которой это исправлено, но пока вы не будете уверены, что проблемы с этой областью функциональности связаны с вашим кодом или системой плагинов , Поэтому я рекомендую сейчас придерживаться основных языковых возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...