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

时间:2018-10-14 05:27:01

标签: go gob go-interface

我最近重新组织了代码,以便在main软件包下有两个软件包:chainapi

chain中,我定义了一些结构SomeStruct1SomeStruct2和这些结构的接口SomeInterfacechain/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.SomeStruct1gob.Register()我在哪里弄错了?

1 个答案:

答案 0 :(得分:0)

我无法完全解决问题,我认为原因是chain.SomeStruct1在运行时被识别为名称为main.SomeStruct1,而其内部名称为{{1 }}。

因此,我现在的解决方法是使用main.SomeStruct1