Метод gzip.Writer.Close

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

Синтаксис

gofunc (w *Writer) Close() error

Пример

Давайте создадим gzip-архив из строки и успешно его закроем:

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 {
    fmt.Println("write error:", err)
    return
  }

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

  // Проверяем, что данные записаны и закрыты
  r, err := gzip.NewReader(&buf)
  if err != nil {
    fmt.Println("reader error:", err)
    return
  }
  defer r.Close()
  data, _ := io.ReadAll(r)
  fmt.Println(string(data))
}

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

go"hello world"

Пример

Попробуем записать данные после вызова метода Close - это приведет к ошибке:

gopackage main

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

func main() {
  var buf bytes.Buffer
  gz := gzip.NewWriter(&buf)
  gz.Write([]byte("hello"))

  // Закрываем архиватор
  err := gz.Close()
  if err != nil {
    fmt.Println("close error:", err)
    return
  }

  // Попытка записи после закрытия
  _, err = gz.Write([]byte(" world"))
  if err != nil {
    fmt.Println("write after close:", err)
  }
}

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

go"write after close: gzip: writer is closed"

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

  • метод gzip.Writer.Flush,
    который сбрасывает данные в выходной поток без завершения архива
  • метод gzip.Writer,
    общее описание структуры для создания gzip-архивов
  • метод gzip.NewWriter,
    который создает новый экземпляр Writer
  • метод gzip.NewWriterLevel,
    который создает Writer с заданным уровнем сжатия