如何在golang中的字符串上使用gzip?

时间:2013-10-05 12:34:29

标签: go gzip

我想使用go从file中读取一个块,将其视为stringgzip此块。我知道如何阅读file并将其视为string,但当谈到"compress/gzip"时,我迷失了。我应该创建一个io.writer,写入buf(字节切片),使用gzip.Writer(io.writer)获取指向io.writer的编写器指针,然后使用{{ 1}}将gzip.Write(chunk_of_file)写入chunk_of_file?那么我需要将字符串视为字节切片..

2 个答案:

答案 0 :(得分:19)

您可以使用gzip.Writer进行编写,因为它实现了io.Writer

示例:

package main

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

func main() {
    var b bytes.Buffer
    gz := gzip.NewWriter(&b)
    if _, err := gz.Write([]byte("YourDataHere")); err != nil {
        panic(err)
    }
    if err := gz.Flush(); err != nil {
        panic(err)
    }
    if err := gz.Close(); err != nil {
        panic(err)
    }
    fmt.Println(b)
}

Playground

如果您想设置压缩级别(默认为"-1" from compress/flate),您可以使用gzip.NewWriterLevel

答案 1 :(得分:0)

如果结果没有返回到文件中,那么您可以使用 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 个字节的开销。

https://golang.org/pkg/compress/flate