为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用golang的zlib?

如何使用golang的zlib?

Go
喵喔喔 2021-05-21 18:19:16
var buf bytes.Buffervar outputBuffer [100]byteb := []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 argumentfmt.Println(outputBuffer)我该怎么做才能做到这一点?谢谢
查看完整描述

2 回答

?
Qyouu

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套接字或网络套接字之类的东西。


查看完整回答
反对 回复 2021-05-31
  • 2 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信