gob.Register 名称未在另一个包中注册接口

gob.Register name not registered for interface in another package

我最近重组了我的代码,现在 main 包下有两个包:chainapi.

chain 中,我定义了一些结构 SomeStruct1SomeStruct2 和这些结构的接口 SomeInterface。以下是 chain/cli.go 的样子。

package chain

type CLI struct{}

func (cli *CLI) Run() {
    ...
    gob.Register(SomeStruct1{})
    gob.Register(SomeStruct2{})
    ...
}

还有一个类似的 api/api.go 里面 Run() 我放了 gob.Register(chain.SomeStruct1{}).

main.go 看起来像这样:

package main

import (
    "myproj/api"
    "myproj/chain"
)

func main() {
    // I have also tried the following lines.
    // gob.Register(chain.SomeStruct1{})
    // gob.Register(chain.SomeStruct2{})
    go api.Run()

    cli := chain.CLI{}
    cli.Run()
}

但是,我在运行时遇到错误 gob: name not registered for interface: "main.SomeStruct1"。当我将所有代码都放在一个 main 包中时,这并没有发生,我觉得 SomeStruct1 现在在 chain 包下但错误指的是 main.SomeStruct1 很奇怪。 gob.Register()我哪里弄错了?

我无法完全解决问题,我认为原因是 chain.SomeStruct1 在运行时以某种方式被识别为具有名称 main.SomeStruct1,而它是使用内部名称 main.SomeStruct1.

因此我现在的解决方法是使用 gob.RegisterName("main.SomeStruct1", chain.SomeStruct1).