我尝试在Go中编写一个kv-raft服务器代码。 (请参阅此article)。
但是如果我想在我的RPC调用参数
中使用context.Context
,我发现存在问题
// Init of my RPC server
kv := new(KVRaft)
rpcs := rpc.NewServer()
rpcs.Register(kv)
....
//My RPC call function
func (kv *KVRaft) Msg(args *context.Context, reply *MsgReply) error {
log.Println("[MSG]", *args)
return nil
}
代码可以编译,但是当我尝试运行时
c, _ := rpc.Dial("tcp", ":1234")
var reply MsgReply{}
c.Call("KVRaft.Msg", someContext, &reply)
它会弹出错误gob: type not registered for interface: context.emptyCtx
如果我将*context.Context
替换为*string
,此代码效果很好。
我用谷歌搜索它可以使用gob.Register()
,但我在gob.Register(context.Context{})
invalid type for composite literal: "golang.org/x/net/context".Context
知道如何将context.Context
作为gob RPC调用参数传递?
[更新]
我尝试使用gob.Register(context.Background())
,但在接收RPC调用时会得到空的上下文。
[更新] 目前我的repo在这里,但仍在进行中。