如何使用golang的zlib?

dav*_*ang 1 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)
Run Code Online (Sandbox Code Playgroud)

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

jor*_*lli 5

好吧,您尝试将数组用作切片。预期为,[]byte而您给了[100]byte。A []byte具有动态宽度,而a [100]byte始终为100字节。数组的大小是其类型的一部分;a [1]int与的类型不同[2]int。这就是为什么几乎所有内容都可以片上运行的原因。

但这不是唯一的事情。当您直接调用Readio.Reader,它会填充目标切片直至其当前宽度,而不会扩展它。如果您将输出切片make([]byte, 10)设为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())
Run Code Online (Sandbox Code Playgroud)

但在这一点上,你可能也只是通os.Stdoutio.Copy,就像他们在做标准库文档。唯一的区别是我们保留了输出格式的副本,但是...如果输出太大而又不想将其保存在内存中怎么办?这就是io.Copy采用接口的原因:您可以采用压缩数据,并将其未经压缩的版本直接写入任何输出流,包括stdout但还包括文件,Unix套接字或网络套接字之类的东西。