gob 恐慌解码接口

2024-01-04

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

Say:

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

显然在这种情况下我需要实施gob.GobEncoder and gob.GobDecoder接口。和如果我直接使用该结构,一切正常:

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

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

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

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

突然它恐慌了:

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

但如果我评论 gob 接口,一切都会变得很好。

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


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

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

type Incer interface {
    Inc()
}

这样解码就成功了。

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

既然你通过了nil价值Decoder.Decode(),解码器需要创建一个零值,但它不知道要实例化什么类型,因为您传递的值是指向接口的指针。您不能创建接口类型的值,只能创建 a 的值concrete可以满足某些接口的类型。

你不能包括gob.GobEncoder and gob.GobDecoder在你的Incer界面。我知道您想确保实现确实实现了它们,但是随后 - 正如您所看到的 - 您将无法将它们解码为“通用”Incer接口值。而且我什至不认为有必要将它们包括在内Incer: gob.GobEncoder and gob.GobDecoder并不是使它们可传播的唯一方法,还有encoding.BinaryMarshaler https://golang.org/pkg/encoding/#BinaryMarshaler and encoding.BinaryUnmarshaler https://golang.org/pkg/encoding/#BinaryUnmarshaler经检查的encoding/gob包裹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gob 恐慌解码接口 的相关文章

  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • Windows-1252 编码 - 显示不正确的字符

    我有一个缓冲区 其中包含以 Windows 1252 编码的字符 然而 当我使用适当的编码创建一个新的字符串时 我经常得到询问标记 而不是预期的结果 例如 byte tmps new byte byte 0xfb System out pr
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 正确的文件扩展名或缩写是什么。 golang 的文本/模板?

    我正在考虑为其创建语法荧光笔 但我不知道这种特定类型模板的常规缩写 In 例子之一 http golang org pkg text template example Template helpers从文本 模板 godoc 中 它们引用
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • Python - Unicode 到 ASCII 的转换

    我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII u ABRA xc3O JOS xc9 I tried encode and decode他们不会这么做 有人有建议吗 Unicode 字符u xce0 and u xc
  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • 在python中设置区域设置编码

    我通过以下方式从 python 代码调用 java 程序 subprocess check output java classpath Users feralvam Programas semanticvectors 3 4 semanti
  • golang无法启动调试,显示未找到框架CoreFoundation

    我使用的是 Macbook pro m1 在数据迁移或更新到 monterey 后 不确定是什么原因导致的 golang 似乎无法调试或 go list 编译 我尝试重新安装 更新 golang 结果是一样的 Go版本 1 17 3 dar
  • crypto createHMAC 输出根据 Nodejs 版本而有所不同

    我在升级节点版本时遇到加密模块问题 创建的HMAC取决于节点的版本 您将在下面找到重现该问题的代码片段 如果我将密钥编码为 BASE64 或任何 HMAC 不依赖于 node js 版本 如果我将其编码为二进制 则当我更改 Node js
  • charset-utf8 和字符实体

    我建议将我的 windows 1252 XHTML 网页转换为 UTF 8 我的编码中有以下字符实体 39 撇号 9658 右指针 9668 左指针 如果我使用编辑器更改字符集并将页面保存为 UTF 8 撇号保留为字符实体 指针被转换为代码
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • Java特殊字符替换

    我有一段文字 Csukl si roham gy t rheti a sv deket annyit emlegetikmostans g ism t a sv d modellt Magyarorsz gon 在原始文本中根本没有换行符
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 使用泛型:类型参数 T 不能与 == 进行比较

    我正在操场上玩 Go Generics 尝试编写一些通用数组函数 https gotipplay golang org p vS7f Vxxy2j https gotipplay golang org p vS7f Vxxy2j packa

随机推荐

  • 当每 4 分钟发送一次保持活动请求时,Azure Functions 在消耗计划中仍处于“冷启动”状态

    我已经读过了解无服务器冷启动 Azure 应用服务团队博客 https blogs msdn microsoft com appserviceteam 2018 02 07 understanding serverless cold sta
  • 将列添加到动物园对象

    我有一个动物园对象z10行2列如下 Date Return 1986 01 0 00308215260513781 1986 02 0 00305355599484584 1986 10 0 00349830477430457 我需要一个n
  • 在 Unity 中重复音频剪辑,间隔越来越小

    我希望倒计时器在倒计时时滴答得更快 滴答声 是一个非常短的音频片段 我已经让计时器工作了 它每帧都会调用 playTickManager 然而 通过此实现 在取消 重新调用的某些转换中 滴答声之间的间隙不一致或重叠 导致滴答声听起来不自然
  • 如何测试 Intuit 重新连接 api?

    我正在构建一个页面 该页面将向 Intuit Reconnect API 发送请求以更新 Oauth 令牌和令牌秘密值 这是工作 但我的测试 Oauth 值不在过期 30 天内 因此 响应始终是 令牌刷新窗口超出范围 有没有办法解决这个问题
  • 在 Django 中,如何调用“用户组”作为模型类中的外键?

    我创建了一个名为 Question 的模型类 我希望只有特定的用户组才能回答问题 现在 我如何从用户组中引入外键 在我的数据库中有一个问题表 会有很多问题 但并非所有用户都可以查看或回答问题 这将取决于用户属于哪个用户组 所以我必须指定允许
  • 如何挂载 kubernetes.io/dockerconfigjson

    我有一个类型的秘密kubernetes io dockerconfigjson kubectl describe secrets dockerjson Name dockerjson Namespace my prd Labels
  • div 中的图像水平居中[重复]

    这个问题在这里已经有答案了 我有一个img在 div class top image 并且我希望这个图像正好位于 div 的中间 但我尝试的任何方法都不起作用 谢谢你的帮助 此处发布的每个解决方案都假设您知道您的尺寸img 这不是常见的情况
  • 将 Webhook 用于 Microsoft Graph API 的问题

    我使用 Graph API 为群组对话添加网络挂钩 因为我需要监视所有组的对话 所以我读取了组列表并为每个组添加了网络挂钩 20 30组后 不同账户的数量会有所不同 Graph API开始返回错误 error code message Se
  • SurfaceTexture.getTransformMatrix的返回值是什么意思,谁能解释一下?

    每个人 我正在Android中使用SurfaceTexture 但我无法理解它的API getTransformMatrix float mtx API文档如下 Retrieve the 4x4 texture coordinate tra
  • 目标构建失败后 CMake 运行自定义命令

    我知道如何在使用 add custom command 构建目标之后 或之前 运行命令 add custom command TARGET my target POST BUILD COMMAND echo custom command 但
  • Apache RewriteRule 到子目录

    我需要将 myhomepage com 重定向到 myhomepage com sub 当我阅读 apache org docs 1 3 misc rewriteguide html 上的指南时 我不知道他们在说什么 因此我决定友好地询问这
  • 在 WPF WebBrowser 控件中显示字符串中的 html

    我的数据上下文对象包含一个字符串属性 该属性返回我需要在 WebBrowser 控件中显示的 html 我找不到可将其绑定到的 WebBrowser 的任何属性 有任何想法吗 Thanks The WebBrowser has a 导航至字
  • 有效的 XPath 表达式

    只是两个问题 如何检查分配给变量的字符串是否对应于有效的 XPath 表达式 如果请求的资源不存在 如何返回自定义的错误消息 如果 XPath 无效 您将收到异常 如果请求的节点不存在 您将得到空结果 放 例如 from lxml impo
  • 如何设置 MPNowPlayingInfoCenter 的图稿图像

    我一直在尝试更新以下项目中显示的艺术品MPNowPlayingInfoCenter using MPMediaItemPropertyArtwork如以下代码所示 取自苹果的文档 https developer apple com docu
  • MySQL week() 函数以星期六开始

    在 MySQL 中 是否有可能或者如何修改 week 以便一周从星期六开始 我在用WEEK CURDATE 0 获取开始日期为星期日的周数 但是 我想获取起始日为星期六的周数 我想我找到了一种方法 只需将日期移 1 天即可 WEEK CUR
  • jQuery-mobile 1.3 面板始终可见

    在新的 jQuery mobile 1 3 版本中 如何添加一个从一开始就始终可见的左侧面板 该面板将充当导航菜单 Thanks 您可以像这样以编程方式打开它 document on pagebeforeshow index functio
  • 无法更改 Unity 中 Inspector 变量中的数组大小?

    根据我读到的内容 这就是矢量 大小 的设置方式 public Color teamAColors new Color 4 But when the code is run it looks like this 我为 4 设置的数字似乎并不重
  • 为什么 Rails 命令强制显示“new”命令的帮助消息?

    奇怪的是 在某些情况下我无法执行典型的 Rails 命令 例如rails s and rails c 我发现这种情况发生在某个功能分支上 过去也偶尔发生过 但目前适用于我的develop branch 我逆转了任何 rb可以加载并产生任何效
  • 具有多个数据库的 Rails RSpec

    我运行一个 Rails 应用程序 我们正在将注册流程拆分为一个单独的应用程序 注册应用程序有自己独立的数据库 用于 CMS 和收集潜在客户 但它还需要访问主数据库 使用这个效果非常好ActiveRecord Base establish c
  • gob 恐慌解码接口

    我有一个带有未导出字段的结构 应该对其进行 gob 编码和解码 Say type A struct s int func a A Inc a s 显然在这种情况下我需要实施gob GobEncoder and gob GobDecoder接