Golang RPC кодирует пользовательскую функцию

Я пытаюсь использовать github.com/dullgiulio/pingo и отправьте мою собственную структуру

type LuaPlugin struct {
    Name string
    List []PluginTable
}

type PluginTable struct {
    Name string
    F lua.LGFunction
}

// LoadPlugins walks over the plugin directory loading all exported plugins
func LoadPlugins() {
    //
    p := pingo.NewPlugin("tcp", "plugins/test")
    // Actually start the plugin
    p.Start()
    // Remember to stop the plugin when done using it
    defer p.Stop()

    gob.Register(&LuaPlugin{})
    gob.Register(&PluginTable{})

    var resp *LuaPlugin

    // Call a function from the object we created previously
    if err := p.Call("MyPlugin.SayHello", "Go developer", &resp); err != nil {
        log.Print(err)
    } else {
        log.Print(resp.List[0])
    }
}

Однако я всегда получаю nil для F поле ym struct. Это то, что я отправляю на клиент

// Create an object to be exported
type MyPlugin struct{}

// Exported method, with a RPC signature
func (p *MyPlugin) SayHello(name string, msg *util.LuaPlugin) error {
    //

    //
    *msg = util.LuaPlugin{
        Name: "test",
        List: []util.PluginTable{
            {
                Name: "hey",
                F: func(L *lua.LState) int {
                    log.Println(L.ToString(2))
                    return 0
                },
            },
        },
    }
    return nil
}

Разве нельзя отправлять пользовательские типы данных через RPC?

1 ответ

Я не знаком с библиотекой, однако, вы можете попробовать преобразовать структуру в кусочек байта перед транспортировкой. Поздний ответ, может помочь другим....

Простое преобразование: возвращает структуру в байтах

func StructToBytes(s interface{}) (converted []byte, err error) {
    var buff bytes.Buffer
    encoder := gob.NewEncoder(&buff)
    if err = encoder.Encode(s); err != nil {
        return
    }
    converted = buff.Bytes()
    return
}

Декодер: возвращает оболочку для декодирования байтов в

func Decoder(rawBytes []byte) (decoder *gob.Decoder) {
    reader := bytes.NewReader(rawBytes)
    decoder = gob.NewDecoder(reader)
    return
}

Пример:

type MyStruct struct {
    Name string
}

toEncode := MyStruct{"John Doe"}

// convert the struct to bytes
structBytes, err := StructToBytes(toEncode)
if err != nil {
    panic(err)
}

//-----------
// send over RPC and decode on other side
//-----------

// create a new struct to decode into
var DecodeInto MyStruct

// pass the bytes to the decoder
decoder := Decoder(structBytes)

// Decode into the struct
decoder.Decode(&DecodeInto)

fmt.Println(DecodeInto.Name) // John Doe

Благодаря использованию пакета gob вы можете в определенной степени поменять местами типы и типы.

Для получения дополнительной информации см.: https://golang.org/pkg/encoding/gob/

Другие вопросы по тегам