如何使用golang的zlib?

时间:2013-01-31 09:31:15

标签: arrays go slice

var buf bytes.Buffer

var outputBuffer [100]byte
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"],"test":{"prop1":1,"prop2":[1,2,3]}}`)

w := zlib.NewWriter(&buf)
r, _ := zlib.NewReader(&buf)
w.Write(b)
w.Flush()
r.Read(outputBuffer)//cannot use outputBuffer (type [100]byte) as type []byte in function argument
fmt.Println(outputBuffer)

我该怎么做才能做到这一点?感谢

2 个答案:

答案 0 :(得分:4)

你试图将数组用作切片。它预计为[]byte,您给它[100]byte[]byte具有动态宽度,而[100]byte始终为100字节。数组的大小是其类型的一部分; [1]int[2]int的类型不同。这就是为什么几乎所有东西都在切片上运作的原因。

但这不是唯一的事情。当您直接在Read上调用io.Reader时,它会将目标切片填充到当前宽度,而不会展开它。如果您的输出切片宽度为10个字节(make([]byte, 10)),那么您将看到的输出为{"Name":"W

var in bytes.Buffer
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"],"test":{"prop1":1,"prop2":[1,2,3]}}`)
w := zlib.NewWriter(&in)
w.Write(b)
w.Close()

var out bytes.Buffer
r, _ := zlib.NewReader(&in)
io.Copy(&out, r)
os.Stdout.Write(out.Bytes())

但此时,您也可以将os.Stdout传递给io.Copy,就像在the standard library docs中一样。唯一的区别是我们保留了输出格式的副本,但是......如果输出太大而你不想把它保存在内存中怎么办?这就是io.Copy接受接口的原因:您可以获取压缩数据,并将其未压缩版本直接写入任何输出流,包括stdout,还包括文件,unix套接字或网络套接字等。

答案 1 :(得分:-1)

请尝试以下方法之一:

r.Read([]byte(outputBuffer))

r.Read(outputBuffer[0:100])

我认为这与Go的切片与固定大小数组的概念有关。您可以在此处阅读有关这些概念的更多信息(有关数组和切片的部分):

http://www.golang-book.com/6

还有其他方法,例如,最初使outputBuffer成为一个合适的切片,而不是固定长度的数组,但是使用上面的指针,你应该能够解决它。