gpt4 book ai didi

gob panic 解码接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 00:44:53 24 4
gpt4 key购买 nike

我有一个包含未导出字段的结构,应该进行 gob 编码和解码。

说:

type A struct {
s int
}
func (a *A) Inc() {
a.s++
}

显然,在这种情况下,我需要实现 gob.GobEncodergob.GobDecoder 接口(interface)。 如果我直接使用该结构,一切正常:

https://play.golang.org/p/dm3HwaI8eU

但我还需要一个实现相同逻辑且可序列化的接口(interface):

type Incer interface {
gob.GobEncoder
gob.GobDecoder
Inc()
}

完整代码:https://play.golang.org/p/Zig2mPrnrq

突然间它 panic 了:

panic: interface conversion: interface is nil, not gob.GobDecoder [recovered]
panic: interface conversion: interface is nil, not gob.GobDecoder

但是,如果我将 gob 接口(interface)注释掉,一切都会恢复正常。

我错过了什么重要的东西吗?因为所描述的行为对我来说似乎很奇怪

最佳答案

问题在于Incer接口(interface)实现了一个特殊的接口(interface),特殊给encoding/gob包:gob.GobDecoder .

如果您的 Incer 接口(interface)只包含 Inc() 方法,它将起作用,因为 gob 解码器看到您正在解码为接口(interface)类型,并且它将使用传输类型解码值并在运行时检查解码值(其类型包含在流中并传输)是否实现目标接口(interface)类型,在这种情况下它将:

type Incer interface {
Inc()
}

所以解码成功。

如果 Incer 接口(interface)还嵌入了 gob.GobEncodergob.GobDecoder 接口(interface),根据定义,它们负责执行编码/解码。如果一个类型实现了这些接口(interface),解码器将不会尝试使用传输的类型解码值,而是调用目标值的 GobDecode() 方法,如果需要则创建一个零值。

由于您将 nil 值传递给 Decoder.Decode(),解码器需要创建一个零值,但它不知道要实例化什么类型,因为您传递的值是指向接口(interface)的指针。您不能创建接口(interface)类型的值,只能创建满足特定接口(interface)的具体类型的值。

您不能在Incer 界面中包含gob.GobEncodergob.GobDecoder。我知道您想确保实现确实实现了它们,但是如您所见,您将无法将它们解码为“通用”Incer 接口(interface)值。此外,我什至不认为需要将它们包含在 Incer 中:gob.GobEncodergob.GobDecoder 不是唯一的制作方法它们是可传输的,还有encoding.BinaryMarshalerencoding.BinaryUnmarshalerencoding/gob 包检查。

关于gob panic 解码接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43324919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com