2 回答
TA贡献1786条经验 获得超11个赞
好吧,您尝试将数组用作切片。预期为,[]byte而您给了[100]byte。A[]byte具有动态宽度,而a[100]byte始终为100字节。数组的大小是其类型的一部分;a[1]int是与a不同的类型[2]int。这就是为什么几乎所有内容都可以片上运行的原因。
但这不是唯一的事情。当您直接调用Read时io.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())
但在这一点上,你可能也只是通os.Stdout到io.Copy,就像他们在做标准库文档。唯一的区别是我们保留了输出格式的副本,但是...如果输出太大而又不想将其保存在内存中怎么办?这就是io.Copy采用接口的原因:您可以采用压缩的数据,并将其未压缩的版本直接写入任何输出流,包括stdout但还包括文件,Unix套接字或网络套接字之类的东西。
- 2 回答
- 0 关注
- 287 浏览
添加回答
举报