gob.未为另一个包中的接口注册注册表名
我最近重组了我的代码,现在在gob.未为另一个包中的接口注册注册表名,go,gob,go-interface,Go,Gob,Go Interface,我最近重组了我的代码,现在在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{})
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
where-inRun()
I-putgob.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未为接口注册:“main.SomeStruct1”
。当我把所有代码都放在一个main
包中时,这种情况并没有发生,我觉得SomeStruct1
现在在chain
包下很奇怪,但错误指的是main.SomeStruct1
。我在哪里出错了gob.Register()
?我还不能完全解决这个问题,我认为原因是链。SomeStruct1
在运行时以某种方式被识别为具有名称main.SomeStruct1
,而它是使用内部名称main.SomeStruct1
注册的
因此,我现在有一个解决方法是使用
gob.RegisterName(“main.SomeStruct1”,chain.SomeStruct1)
我无法完全解决这个问题,我认为原因是链。SomeStruct1
在运行时不知何故被识别为具有名称main.SomeStruct1
,而它是使用内部名称main.SomeStruct1
注册的
因此,我现在的一个解决方法是使用
gob.RegisterName(“main.SomeStruct1”,chain.SomeStruct1)
尝试将go.Register()
语句放在init()
函数中,将gob.Register()
放在init()
中不起作用。我还尝试将gob.Register()放在decoder.Decode()前面的行上,但相同的错误仍然存在。我认为根本的问题是chain.someStruct1
不知何故被标识为main.someStruct1
。作为一种解决方法,我现在使用gob.RegisterName(“main.someStruct1”,chain.someStruct1),目前一切似乎都很好。我建议您将解决方案作为答案发布,然后批准它。otherstry将go.Register()
语句放在init()
functionputgob.Register()
的init()中可能很有用。我还尝试将gob.Register()放在decoder.Decode()前面的行上,但相同的错误仍然存在。我认为根本的问题是chain.someStruct1
不知何故被标识为main.someStruct1
。作为一种解决方法,我现在使用gob.RegisterName(“main.someStruct1”,chain.someStruct1),目前一切似乎都很好。我建议您将解决方案作为答案发布,然后批准它。它可能对其他人有用