go zlib 压缩问题
- 这两段代码第一个能够显示正确结果。第二个不能显示正确结果。
func compress(input []byte) []byte {
var in bytes.Buffer
zlibWriter, err := zlib.NewWriterLevel(&in, zlib.BestCompression)
if err != nil {
return nil
}
zlibWriter.Write(input)
zlibWriter.Close()
fmt.Printf("第一个函数: before %v\n", in.Bytes())
return in.Bytes()
}
func compressContractFile(input []byte) error {
var in bytes.Buffer
zlibWriter, err := zlib.NewWriterLevel(&in, zlib.BestCompression)
if err != nil {
return err
}
defer zlibWriter.Close()
zlibWriter.Write(input)
sc.ContractFile = in.Bytes()
fmt.Printf("第二个函数: after compress %v\n", input)
return err
}
-
原始数据[]byte before compresss : [50 57 48 56 50 51 66 57 48 49 50 52 50 49 48 57 56 51 50 48 49]
- 利用第一个函数压缩: after compress [120 218 50 178 52 176 48 50 118 178 52 48 52 50 49 50 52 176 180 48 54 50 48 4 4 0 0 255 255 47 134 4 69]
- 利用第二个函数压缩: after compress [120 218]
-
因为这里defer最后才调用,io.copy的时候就会找不到EOF,所以在解压的时候就会报错。
-
“defer语句用于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行,它会在外围函数或者方法返回之前但是其返回值(如果有的话)计算之后执行。这样就有可能在一个被延迟执行的函数内部修改外围函数的命名返回值”
-
这是不是也能侧面说明,在程序执行return 语句之后,返回的不是真正的in.Bytes()底层Slice,而是底层Slice的拷贝。所以在最后defer执行的时候,把EOF写入到了in.Bytes()里面,但没有写入到in.Bytes()的拷贝里面。
浙公网安备 33010602011771号