Go 如何在字符串上使用gzip?

Go 如何在字符串上使用gzip?,go,gzip,Go,Gzip,我想使用Go从文件中读取块,将其视为字符串和gzip此块。我知道如何读取文件并将其视为字符串,但当涉及到压缩/gzip时,我就不知所措了 我应该创建一个写入buf(字节片)的io.writer,使用gzip.NewWriter(io.writer)获取w*gzip.writer,然后使用w.Write(chunk\u文件)将文件块写入buf?然后我需要将字符串视为字节片。您可以在它实现时使用io.Writer进行编写 例如: 主程序包 进口( “字节” “压缩/gzip” “fmt” “日志”

我想使用Go从文件中读取块,将其视为
字符串
gzip
此块。我知道如何读取文件并将其视为
字符串
,但当涉及到
压缩/gzip时,我就不知所措了

我应该创建一个写入
buf
(字节片)的
io.writer
,使用
gzip.NewWriter(io.writer)
获取
w*gzip.writer
,然后使用
w.Write(chunk\u文件)
将文件块写入
buf
?然后我需要将字符串视为字节片。

您可以在它实现时使用
io.Writer
进行编写

例如:

主程序包
进口(
“字节”
“压缩/gzip”
“fmt”
“日志”
)
func main(){
VARBytes.Buffer
gz:=gzip.NewWriter(&b)
如果,err:=gz.Write([]字节(“YourDataHere”);err!=nil{
log.Fatal(错误)
}
如果错误:=gz.Close();错误!=nil{
log.Fatal(错误)
}
fmt.Println(b.Bytes())
}


如果要设置压缩级别(默认值为-1 from),可以使用。

如果结果没有返回到文件中,则可以使用Flate 直接:

package main

import (
   "bytes"
   "compress/flate"
   "compress/gzip"
)

func main() {
   b := bytes.Repeat([]byte("south north"), 999_999)
   { // gzip
      buf := new(bytes.Buffer)
      w := gzip.NewWriter(buf)
      w.Write(b)
      w.Close()
      println(buf.Len() == 21395)
   }
   { // flate
      buf := new(bytes.Buffer)
      w, e := flate.NewWriter(buf, -1)
      if e != nil {
         panic(e)
      }
      w.Write(b)
      w.Close()
      println(buf.Len() == 21377)
   }
}
这并不多,但您可以从Gzip中节省18字节的开销


可能的重复我被你的问题搞糊涂了,在Go中字符串是一个[]字节,所以如果你想它是一个,就把它转换成[]字节(mystringvar)我觉得应该注意的是,在调用
gz.Flush()
之前,编写器不会将压缩字节写入缓冲区。flush也可以通过
gz.Close()
调用,但游乐场示例从来没有这么远。还有一件事是flush()只将当前数据写入缓冲区。它并没有完成整个GZIP格式。所以,在这种情况下,它是非常无用的,因为最后一行上写的不是有效的GZIP结构。在对缓冲区执行任何操作之前,需要调用Close()。@PhilKulak感谢您的更正。我更改了示例代码,在打印缓冲区内容之前关闭编写器。您只需调用close()。从golang文档中:func(z*Writer)Close()error Close关闭写入程序,将所有未写入的数据刷新到基础io.Writer,但不关闭基础io.Writer。非常好的提示@PhilKulak。只需添加一点,使用“延迟”关闭压缩的写入程序可能会导致在关闭缓冲区之前使用缓冲区的细微错误。读取压缩数据时,这可能导致意外的EOF错误。小心