Функция gzip.NewReader

Функция gzip.NewReader создает новый ридер для чтения данных, сжатых в формате gzip. В единственный параметр функция принимает интерфейс io.Reader, который представляет собой источник сжатых данных. Функция возвращает указатель на структуру gzip.Reader и ошибку, которая возникает при неудачном чтении заголовка gzip.

Синтаксис

gogzip.NewReader(r io.Reader) (*gzip.Reader, error)

Пример

Давайте прочитаем сжатые gzip данные из файла:

gopackage main

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

func main() {
  file, err := os.Open("data.gz")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  gzReader, err := gzip.NewReader(file)
  if err != nil {
    fmt.Println("Error creating gzip reader:", err)
    return
  }
  defer gzReader.Close()

  data, err := io.ReadAll(gzReader)
  if err != nil {
    fmt.Println("Error reading data:", err)
    return
  }

  fmt.Println(string(data))
}

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

go"Hello, World!"

Пример

Давайте прочитаем gzip данные из строки, используя strings.NewReader:

gopackage main

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

func main() {
  // Gzip сжатые данные в виде строки
  gzipData := "\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xf2H\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x00\x00\xff\xff\x01\x00\x00\xff\xff\xe1\x05\x00\x00"
  reader := strings.NewReader(gzipData)

  gzReader, err := gzip.NewReader(reader)
  if err != nil {
    fmt.Println("Error creating gzip reader:", err)
    return
  }
  defer gzReader.Close()

  data, err := io.ReadAll(gzReader)
  if err != nil {
    fmt.Println("Error reading data:", err)
    return
  }

  fmt.Println(string(data))
}

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

go"Hello World"

Пример

Давайте прочитаем сжатые данные из байтового буфера:

gopackage main

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

func main() {
  compressedData := []byte{
    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xff, 0xf2, 0x48, 0xcd, 0xc9, 0xc9, 0x57,
    0x28, 0xcf, 0x2f, 0xca, 0x49, 0x01, 0x00, 0x00,
    0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff,
    0xe1, 0x05, 0x00, 0x00,
  }
  buf := bytes.NewReader(compressedData)

  gzReader, err := gzip.NewReader(buf)
  if err != nil {
    fmt.Println("Error creating gzip reader:", err)
    return
  }
  defer gzReader.Close()

  data, err := io.ReadAll(gzReader)
  if err != nil {
    fmt.Println("Error reading data:", err)
    return
  }

  fmt.Println(string(data))
}

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

go"Hello"

Пример

Давайте обработаем ошибку при попытке чтения невалидных gzip данных:

gopackage main

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

func main() {
  invalidData := strings.NewReader("not a gzip file")

  gzReader, err := gzip.NewReader(invalidData)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer gzReader.Close()
}

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

go"Error: gzip: invalid header"

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

  • функцию gzip.NewWriter,
    которая создает ридер для записи gzip-данных
  • функцию gzip.Reader,
    которая представляет структуру ридера gzip
  • функцию gzip.Reader.Close,
    которая закрывает ридер и освобождает ресурсы
  • функцию gzip.NewWriterLevel,
    которая создает ридер с указанным уровнем сжатия