Пакет compress/zlib
Пакет compress/zlib реализует сжатие и распаковку данных
в формате zlib. Для сжатия данных используется функция
zlib.NewWriter, которая принимает io.Writer и возвращает
указатель на писатель, использующий алгоритм Deflate. Для
распаковки данных используется функция zlib.NewReader,
которая принимает io.Reader и возвращает объект для чтения
распакованных данных.
Сжатие данных с zlib.NewWriter
Давайте сожмем строку 'abcde' в формате zlib и запишем
результат в буфер:
package main
import (
"bytes"
"compress/zlib"
"fmt"
"io"
)
func main() {
var buf bytes.Buffer
w := zlib.NewWriter(&buf)
text := []byte("abcde")
w.Write(text)
w.Close()
fmt.Println(buf.Bytes())
}
Результат выполнения кода:
[120 156 75 76 76 44 45 1 0 2 172 1 230]
В данном примере мы создаем буфер, инициализируем писатель zlib, записываем в него строку и закрываем писатель. В результате получаем сжатые данные в формате zlib.
Распаковка данных с zlib.NewReader
Давайте распакуем данные, сжатые в предыдущем примере:
package main
import (
"bytes"
"compress/zlib"
"fmt"
"io"
)
func main() {
compressed := []byte{120, 156, 75, 76, 76, 44, 45, 1, 0, 2, 172, 1, 230}
buf := bytes.NewReader(compressed)
r, err := zlib.NewReader(buf)
if err != nil {
fmt.Println("Error:", err)
return
}
defer r.Close()
res, err := io.ReadAll(r)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(res))
}
Результат выполнения кода:
"abcde"
Мы создаем ридер из сжатых данных, используем
zlib.NewReader для распаковки и считываем результат
с помощью io.ReadAll. В результате получаем исходную
строку.
Сжатие с выбором уровня сжатия
Функция zlib.NewWriterLevel позволяет указать уровень
сжатия. Доступны константы zlib.BestSpeed,
zlib.BestCompression и zlib.DefaultCompression:
package main
import (
"bytes"
"compress/zlib"
"fmt"
)
func main() {
var buf bytes.Buffer
w, err := zlib.NewWriterLevel(&buf, zlib.BestCompression)
if err != nil {
fmt.Println("Error:", err)
return
}
text := []byte("abcde")
w.Write(text)
w.Close()
fmt.Println(buf.Bytes())
}
Результат выполнения кода:
[120 156 75 76 76 44 45 1 0 2 172 1 230]
При использовании уровня сжатия BestCompression алгоритм
затрачивает больше времени на сжатие, но достигает меньшего
размера выходных данных.
Обработка ошибок при распаковке
Функция zlib.NewReader возвращает ошибку, если переданные
данные не являются корректным потоком zlib:
package main
import (
"bytes"
"compress/zlib"
"fmt"
)
func main() {
invalidData := []byte{1, 2, 3, 4, 5}
buf := bytes.NewReader(invalidData)
_, err := zlib.NewReader(buf)
if err != nil {
fmt.Println(err)
}
}
Результат выполнения кода:
"zlib: invalid header"
В этом примере мы пытаемся распаковать невалидные данные и получаем соответствующую ошибку о некорректном заголовке zlib.
Смотрите также
-
пакет
compress/gzip,
который предоставляет аналогичный функционал, но в формате gzip -
функцию
zlib.NewReader,
которая создает ридер для распаковки данных zlib -
функцию
zlib.NewWriter,
которая создает писатель для сжатия данных в формате zlib -
пакет
compress/flate,
который реализует базовый алгоритм Deflate, используемый в zlib