gob.Register 名称未在另一个包中注册接口
gob.Register name not registered for interface in another package
我最近重组了我的代码,现在 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()
我哪里弄错了?
我无法完全解决问题,我认为原因是 chain.SomeStruct1
在运行时以某种方式被识别为具有名称 main.SomeStruct1
,而它是使用内部名称 main.SomeStruct1
.
因此我现在的解决方法是使用 gob.RegisterName("main.SomeStruct1", chain.SomeStruct1)
.
我最近重组了我的代码,现在 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()
我哪里弄错了?
我无法完全解决问题,我认为原因是 chain.SomeStruct1
在运行时以某种方式被识别为具有名称 main.SomeStruct1
,而它是使用内部名称 main.SomeStruct1
.
因此我现在的解决方法是使用 gob.RegisterName("main.SomeStruct1", chain.SomeStruct1)
.