我最近重新组织了代码,以便在main
软件包下有两个软件包:chain
和api
。
在chain
中,我定义了一些结构SomeStruct1
,SomeStruct2
和这些结构的接口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()
我在哪里弄错了?
答案 0 :(得分:0)
我无法完全解决问题,我认为原因是chain.SomeStruct1
在运行时被识别为名称为main.SomeStruct1
,而其内部名称为{{1 }}。
因此,我现在的解决方法是使用main.SomeStruct1
。