jjzjj

gob 编码崩溃

coder 2023-07-02 原文

我想开发一个 type data struct 来实现磁盘存储。我在将数据对象编码为字节时遇到了问题。对于编码,我想使用 encoding/gob 包。

package data

import (
    "encoding/gob"
    "io"
)
func NewKey(key string) Data {
    ret := Data{MsgType: "key", Value: key}
    return ret
}

func NewData(d string) Data {
    ret := Data{MsgType: "data", Value: d}
    return ret
}

type Data struct {
    MsgType string
    Value   string
}

func (dat Data) Encode () io.Writer {
    var ret io.Writer
    enc := gob.NewEncoder(ret)
    _ = enc.Encode(dat)
    // if err != nil {
    //  panic(err)
    // }
    return ret
}

这是数据包的代码。我的目标是将 Data 类型转换为 byte slice ,以便我可以用 diskv 存储它。 我的主要代码如下所示: 包主

import (
    "fmt"
    "pkg"
)

func main() {
    testData := data.Data{MsgType:"string", Value:"1"}
    ret := testData.Encode()
    // fmt.Println(ret)
    fmt.Sprintf("%T", ret)
}

但是当我使用 go run 运行代码时,我得到以下输出:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x18 pc=0x4a15b4]

goroutine 1 [running]:
encoding/gob.(*Encoder).writeMessage(0xc0000440a0, 0x0, 0x0, 0xc0000440d8)
    C:/Program Files/Go/src/encoding/gob/encoder.go:82 +0x134
encoding/gob.(*Encoder).sendActualType(0xc0000440a0, 0x0, 0x0, 0xc000037600, 0xc0000375c0, 0x506800, 0x4d2580, 0x38)
    C:/Program Files/Go/src/encoding/gob/encoder.go:107 +0x223
encoding/gob.(*Encoder).sendType(0xc0000440a0, 0x0, 0x0, 0xc000037600, 0x506800, 0x4d2580, 0xc000067de0)
    C:/Program Files/Go/src/encoding/gob/encoder.go:169 +0xda
encoding/gob.(*Encoder).sendTypeDescriptor(0xc0000440a0, 0x0, 0x0, 0xc000037600, 0xc0000375c0)
    C:/Program Files/Go/src/encoding/gob/encoder.go:191 +0xd9
encoding/gob.(*Encoder).EncodeValue(0xc0000440a0, 0x4d2580, 0xc000004c00, 0x99, 0x0, 0x0)
    C:/Program Files/Go/src/encoding/gob/encoder.go:244 +0x2f3
encoding/gob.(*Encoder).Encode(0xc0000440a0, 0x4d2580, 0xc000004c00, 0xc000004c00, 0x0)
    C:/Program Files/Go/src/encoding/gob/encoder.go:176 +0xad
pkg.Data.Encode(0x4e66e9, 0x6, 0x4e614a, 0x1, 0x0, 0x0)
    C:/Users/eliap/OneDrive/Dokumente/Programming/Go/src/pkg/data.go:25 +0xa2
main.main()
    C:/Users/eliap/OneDrive/Dokumente/Programming/Go/src/test.go:10 +0x56
exit status 2
[Finished in 1.1s with exit code 1]
[cmd: ['go', 'run', 'C:\\Users\\eliap\\OneDrive\\Dokumente\\Programming\\Go\\src\\test.go']]
[dir: C:\Users\eliap\OneDrive\Dokumente\Programming\Go\src]
[path: C:\ProgramData\DockerDesktop\version-bin;C:\Program Files\Docker\Docker\Resources\bin;C:\Program Files\Python37\;C:\Windows\System32;C:\Program Files\Typora\bin;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Python37\Scripts;C:\MinGW\bin;C:\Program Files\Go\bin;C:\Program Files\Git\cmd;C:\Program Files\micro-1.4.1;C:\Program Files\Microsoft VS Code\bin;C:\Program Files (x86)\Midnight Commander;C:\Ruby26-x64\bin;C:\Users\eliap\AppData\Local\Microsoft\WindowsApps;C:\Users\eliap\go\bin]

我正在使用 go version go1.12 windows/amd64、Windows 10 和 Sublime Text 3(如果重要的话) 如果您对 Encode 方法有更好的解决方案/实现,那就更好了。

最佳答案

func (dat Data) Encode () io.Writer {
    var ret io.Writer
    enc := gob.NewEncoder(ret)

  1. 声明一个类型为io.Writer的变量ret
  2. 不要初始化它,因此它的类型为零值,nil
  3. 您将那个 nil 传递给 gob.NewEncoder,它应该将该值写入其内部状态。
  4. 一旦您尝试使用该编码器对某些内容进行编码,并且它决定是时候向提供的 io.Writer 实际写入内容,它就会失败并显示“无效的内存地址或零指针取消引用” "错误。

关于gob 编码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55079951/

有关gob 编码崩溃的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. c - Ruby - 源代码 - 编码风格 - 2

    查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity

  8. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

  9. ruby - 更改字符编码 - 2

    我在使用Ruby1.9.2p290更改文本文件的编码时遇到问题。我收到错误消息invalidbytesequenceinUTF-8(ArgumentError)。问题(我认为)在于字符集似乎是未知的。如果我执行以下操作,则从命令行:$filetest.txt我得到:Non-ISOextended-ASCIIEnglishtext,withCRLFlineterminators或者,或者,如果我这样做:$file-itest.txt我得到:test.txt:text/plain;charset=unknown但是,如果我这样做,在Ruby中:data=File.open("test.tx

  10. ruby-on-rails - 在 rails 中显示 base64 编码的图像 - 2

    我正在向我的Controller发送一个base64图像并按原样保存它。现在我需要显示该图像。这是我要显示的内容,但未显示图像:"/>为了编码,我使用了这个java脚本函数encodeURIComponent();我的编码图像格式:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/........ 最佳答案 你不需要解码base64应该可以 关于ruby-on-rails-在rails中显示base64编码的图像,我们在StackOve

随机推荐