Go 在结构之后存储到磁盘->;[]字节->;采空区->;gzip->;IO->;gzip->;采空区->;[]字节->;结构

Go 在结构之后存储到磁盘->;[]字节->;采空区->;gzip->;IO->;gzip->;采空区->;[]字节->;结构,go,struct,compression,gzip,gob,Go,Struct,Compression,Gzip,Gob,我试图将结构或更准确地说是结构的字节存储到磁盘。我有大量字节数据,我想压缩并存储在磁盘上,以后再恢复。这些数据对除我之外的任何其他应用程序都毫无意义 我可以用Gob编码一个结构([]字节),然后用gzip压缩它。我还可以解压缩生成的数据。然而,当我试图将[]字节的数据转换回结构时,我失败了——失败是一个严重的失败。。。当我从函数中打印出tmp时,这不是一个错误 tmp {A: B:0 C:0} 然而,我开始使用的结构是 type SomeStruct struct { A string

我试图将结构或更准确地说是结构的字节存储到磁盘。我有大量字节数据,我想压缩并存储在磁盘上,以后再恢复。这些数据对除我之外的任何其他应用程序都毫无意义

我可以用Gob编码一个结构([]字节),然后用gzip压缩它。我还可以解压缩生成的数据。然而,当我试图将[]字节的数据转换回结构时,我失败了——失败是一个严重的失败。。。当我从函数中打印出
tmp
时,这不是一个错误

tmp {A: B:0 C:0}
然而,我开始使用的结构是

type SomeStruct struct {
    A string
    B int64
    C float64
}
var testStruct = SomeStruct{
    A: "james bond",
    B: 24,
    C: 1.234,
}
这是我的职责

func GobToStruct(binaryBytes io.Reader) (SomeStruct, error) {
    s, _ := ioutil.ReadAll(binaryBytes)
    fmt.Println("read decompressed bytes ", string(s))
    decoder := gob.NewDecoder(binaryBytes)
    var tmp SomeStruct
    if err := decoder.Decode(&tmp); err != nil {
        if err != io.EOF && err != io.ErrUnexpectedEOF {
            fmt.Println("gob failed ", err)
            return tmp, err
        }
    }
    fmt.Printf("tmp %+v\r\n", tmp)
    return tmp, nil
}
我做错了什么,以至于在取消数据占用后无法将其取回

编辑:
binaryData
在调用
ioutil.ReadAll(binaryBytes)
后处于EOF。解码调用返回io.EOF。应用程序忽略io.EOF。通过删除对
ioutil.ReadAll(binaryBytes)
的调用并将解码返回的所有错误作为错误处理来修复。嗨@PaulHankin我添加了一个要点,并在问题的底部链接到它。谢谢啊!我看到了@Ceriselimonón谢谢!!!更新了gistI,建议使用协议缓冲区。它可以完全做到这一点,但提供向前/向后兼容性,并内置打包序列化。