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)
我该怎么做才能做到这一点?感谢
答案 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的切片与固定大小数组的概念有关。您可以在此处阅读有关这些概念的更多信息(有关数组和切片的部分):
还有其他方法,例如,最初使outputBuffer成为一个合适的切片,而不是固定长度的数组,但是使用上面的指针,你应该能够解决它。