草庐IT

gob panic 解码接口(interface)

coder 2023-06-26 原文

我有一个包含未导出字段的结构,应该进行 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/

有关gob panic 解码接口(interface)的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. ruby-on-rails - 如何在 RubyOnRails 中使用 'acts as nested set' 创建一个可排序的接口(interface) - 2

    我一直在为使用acts_as_list的模型实现一些不错的交互界面,这些界面可以对我的mRails应用程序中的列表进行排序。我有一个排序函数,在每次拖放之后使用sortable_elementscript.aculo.us函数调用并设置每条记录的位置。这是在拖放完成后处理排序的Controller操作示例:defsortparams[:documents].each_with_indexdo|id,index|Document.update_all(['position=?',index+1],['id=?',id])endend现在我正在尝试对嵌套集模型(acts_as_nested

  3. 你真正了解什么是接口测试么?接口实战一“篇”入魂 - 2

    最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,

  4. ruby-on-rails - JSON解码参数问题 - 2

    我有一个使用postgresql的Rails4应用程序。我还有一个backbone.js应用程序,可将JSON推送到Rails4应用程序。这是我的Controller:defcreate@product=Product.new(ActiveSupport::JSON.decodeproduct_params)respond_todo|format|if@product.saveformat.json{renderaction:'show',status::created,location:@product}elseformat.json{renderjson:@product.erro

  5. ruby-on-rails - 在 Ruby on Rails 中为由外部 API 支持的模型使用 ActiveRecord 接口(interface) - 2

    我正在尝试在我的Rails应用程序中使用模型来从外部API检索信息。我想做的是以类似于ActiveRecord模型提供的方式(特别是关联,以及相同风格的可链接查询方法)访问我的数据模型(可能包含来自多个API调用的信息)。我最初的直觉是重新创建我想要的ActiveRecord部分并合并此API。不想“重新发明轮子”并确切地看到添加更多功能需要多少工作让我退后一步并重新评估如何处理这个问题。我找到了在没有表的情况下使用ActiveRecord的方法(请参阅:Railscast#193TablelessModel和博客文章here)并研究了ActiveRecord。因为ActiveMode

  6. ruby - Interface Builder 看不到 MacRuby 的 socket - 2

    我正在尝试使用XCode和InterfaceBuilder构建一个基本的helloworld应用程序。但是,在InterfaceBuilder中,我看不到我的socket可以连接起来。我转到对象检查器Pane的连接选项卡,它显示“NewReferencingOutlet”。我想知道我的代码是否有误。在这里classHelloWorldControllerattr_accessor:hello_label,:hello_button,:hellodefawakeFromNib@hello=trueenddefchangeLabel(sender)if@hello@hello_label.

  7. [译]在C#中使用IComparable和IComparer接口 - 2

    原文:UsetheIComparableandIComparerinterfacesinVisualCSharp本文介绍了在VisualC#中如何使用IComparer和IComparable接口。概要本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不同的用途。如果你有一个支持IComparer的类型数组(例如字符串或整数),你可以对它进行排序而不需要提供任何对IComparer的显式引用(译注:意思是把一个IComparer的实现类作为参数传递给排序方法)。在这种情况下,数组元素会被转换为IComparer的

  8. ruby-on-rails - ActiveSupport::JSON 解码散列丢失符号 - 2

    我正在尝试序列化和反序列化哈希。当散列被反序列化时,键被去符号化;例如不是更多:一个,而是“一个”。从Rails控制台:>>h={:one=>1,:two=>"two"}{:one=>1,:two=>"two"}>>j=ActiveSupport::JSON.encode(h)"{\"one\":1,\"two\":\"two\"}">>h2=ActiveSupport::JSON.decode(j){"one"=>1,"two"=>"two"}>>h2[:one]nil>>h[:one]1我现在已经切换到使用Marshal.dump/load。但是,我想把它扔出去看看是否有办法将它保

  9. API淘宝数据接口 - 2

    如果你想在自己的应用中使用淘宝的数据,那么对接淘宝数据接口是必不可少的一步。本文将介绍如何对接API淘宝数据接口,以便你能够顺利获取和使用淘宝的数据。步骤一:​​获取AppKey和AppSecret​​首先,在淘宝开放平台申请API接口之前,需要先注册为淘宝开发者并创建应用。创建应用后,你将得到一个AppKey和AppSecret,这两个参数需要在调用API接口时用于身份验证。步骤二:确定需要调用的API接口在淘宝开放平台的开发文档中,你将找到所有可用的API接口。你需要根据你的需求找到需要调用的API接口,例如查询商品、店铺等信息。在找到需要的API接口后,你需要了解该接口的请求参数和返回结

  10. ruby - 如何使用 Devise 来保护 delayed_job_web 接口(interface)? - 2

    我正在使用delayed_job_webgem来监控延迟的作业。https://github.com/ejschmitt/delayed_job_web可以使用我的routes.rb中的这一行访问它:match"/delayed_job"=>DelayedJobWeb,:anchor=>false我站点的每个其他区域都需要使用Devisegem登录。我如何使它也需要登录?在自述文件中,他们建议将以下内容添加到config.rb:ifRails.env.production?DelayedJobWeb.useRack::Auth::Basicdo|username,password|us

随机推荐