Golang RPC 编码自定义函数

Posted

技术标签:

【中文标题】Golang RPC 编码自定义函数【英文标题】:Golang RPC encode custom function 【发布时间】:2017-03-26 15:46:48 【问题描述】:

我正在尝试使用 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])
    

但是,对于 ym 结构的 F 字段,我总是得到 nil。这是我在客户端发送的内容

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

【讨论】:

以上是关于Golang RPC 编码自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

golang中自定义包

是否可以在 golang 中使用自定义库触发编译时错误?

golang反射自定义tag

keras中的加权mse自定义损失函数 - 自定义权重

如何实现一个简单的rpc

金字塔 jsonrpc 中的自定义错误消息