Функция gzip.NewWriter

Функция gzip.NewWriter создает новый объект gzip.Writer, который сжимает данные, записываемые в него, в формат gzip. В качестве единственного параметра она принимает объект, реализующий интерфейс io.Writer - обычно это файл или сетевой сокет, в который будет записан сжатый поток. Возвращаемое значение - указатель на gzip.Writer, который используется для записи несжатых данных. После завершения работы с writer его необходимо закрыть методом Close, чтобы записать финальный блок gzip и освободить ресурсы.

Синтаксис

gofunc NewWriter(w io.Writer) *gzip.Writer

Пример

Давайте сожмем строку "hello, world!" с помощью gzip.NewWriter и запишем результат в буфер:

gopackage main

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

func main() {
  var buf bytes.Buffer
  gz := gzip.NewWriter(&buf)

  _, err := gz.Write([]byte("hello, world!"))
  if err != nil {
    panic(err)
  }

  err = gz.Close()
  if err != nil {
    panic(err)
  }

  fmt.Printf("Сжатые данные: %x\n", buf.Bytes())
}

Результат выполнения кода:

go"Сжатые данные: 1f8b08000000000000ff..."

Пример

Теперь запишем сжатые данные в файл. Обратите внимание, что после записи необходимо вызвать Close для корректного завершения:

gopackage main

import (
  "compress/gzip"
  "os"
)

func main() {
  file, err := os.Create("example.gz")
  if err != nil {
    panic(err)
  }
  defer file.Close()

  gz := gzip.NewWriter(file)
  defer gz.Close()

  _, err = gz.Write([]byte("hello, world!"))
  if err != nil {
    panic(err)
  }
}

Результат выполнения кода:

go"" // Файл example.gz создан, ошибок нет

Пример

Также можно использовать gzip.NewWriter для сжатия с последующей записью в сетевой сокет или любой другой потоковый вывод. Важно всегда проверять ошибки после записи:

gopackage main

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

func main() {
  var buf bytes.Buffer
  gz := gzip.NewWriter(&buf)

  data := []string{"abcde", "12345", "xyz"}
  for _, s := range data {
    _, err := gz.Write([]byte(s))
    if err != nil {
      fmt.Println("Error writing:", err)
      return
    }
  }

  err := gz.Close()
  if err != nil {
    fmt.Println("Error closing:", err)
    return
  }

  fmt.Printf("Compressed size: %d bytes", buf.Len())
}

Результат выполнения кода:

go"Compressed size: 23 bytes"

Смотрите также

  • функцию gzip.NewReader,
    которая создает reader для распаковки gzip-данных
  • метод gzip.Writer.Close,
    который завершает запись gzip-потока
  • константу gzip.BestCompression,
    используемую для выбора уровня сжатия
  • функцию gzip.NewWriterLevel,
    позволяющую задать уровень сжатия