【发布时间】:2019-11-18 21:08:20
【问题描述】:
我有一个大的 int 数组,我想在文件系统上保留它。我的理解是存储此类内容的最佳方式是使用gob 包将其转换为字节数组,然后使用gzip 对其进行压缩。 当我再次需要它时,我会反转这个过程。我很确定我正确地存储了它,但是用 EOF 恢复它失败了。长话短说,我在下面有一些示例代码来演示这个问题。 (此处为游乐场链接https://play.golang.org/p/v4rGGeVkLNh)。 我不相信 gob 是必需的,但是阅读它似乎将它存储为字节数组比 int 数组更有效,但这可能不是真的。谢谢!
package main
import (
"bufio"
"bytes"
"compress/gzip"
"encoding/gob"
"fmt"
)
func main() {
arry := []int{1, 2, 3, 4, 5}
//now gob this
var indexBuffer bytes.Buffer
writer := bufio.NewWriter(&indexBuffer)
encoder := gob.NewEncoder(writer)
if err := encoder.Encode(arry); err != nil {
panic(err)
}
//now compress it
var compressionBuffer bytes.Buffer
compressor := gzip.NewWriter(&compressionBuffer)
compressor.Write(indexBuffer.Bytes())
defer compressor.Close()
//<--- I think all is good until here
//now decompress it
buf := bytes.NewBuffer(compressionBuffer.Bytes())
fmt.Println("byte array before unzipping: ", buf.Bytes())
if reader, err := gzip.NewReader(buf); err != nil {
fmt.Println("gzip failed ", err)
panic(err)
} else {
//now ungob it...
var intArray []int
decoder := gob.NewDecoder(reader)
defer reader.Close()
if err := decoder.Decode(&intArray); err != nil {
fmt.Println("gob failed ", err)
panic(err)
}
fmt.Println("final int Array content: ", intArray)
}
}
【问题讨论】:
-
那你的问题是什么?只是
gob是否合适或更有效?或者您的代码有什么具体问题? -
当我尝试在 Gob->compress->expand->Gob 之后恢复初始 int 数组时,我得到一个 EOF - 即它没有恢复到原始 int 数组
标签: go compression gzip eof gob