Пакет compress/flate
Пакет compress/flate реализует алгоритм сжатия DEFLATE,
который используется в форматах gzip и zlib. Пакет предоставляет
функции NewReader для распаковки и NewWriter
для сжатия данных. При создании Writer можно указать
уровень сжатия: от NoCompression до BestCompression.
Пакет также поддерживает чтение данных по частям с помощью
интерфейса io.Reader и запись через io.Writer.
Создание writer для сжатия
Давайте создадим Writer для сжатия данных с уровнем
BestSpeed и запишем в него строку:
package main
import (
"bytes"
"compress/flate"
"fmt"
)
func main() {
var buf bytes.Buffer
writer, err := flate.NewWriter(&buf, flate.BestSpeed)
if err != nil {
fmt.Println("Error:", err)
return
}
defer writer.Close()
data := "abcde"
_, err = writer.Write([]byte(data))
if err != nil {
fmt.Println("Error:", err)
return
}
writer.Close()
fmt.Println(buf.Bytes())
}
Результат выполнения кода:
[229 17 1 44 80 22 14 44 80 22 14 44 80 22 14]
Создание reader для распаковки
Теперь распакуем данные, сжатые в предыдущем примере,
с помощью NewReader:
package main
import (
"bytes"
"compress/flate"
"fmt"
"io"
)
func main() {
compressed := []byte{229, 17, 1, 44, 80, 22, 14, 44, 80, 22, 14, 44, 80, 22, 14}
reader := flate.NewReader(bytes.NewReader(compressed))
defer reader.Close()
decompressed, err := io.ReadAll(reader)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(decompressed))
}
Результат выполнения кода:
"abcde"
Прямое сжатие и распаковка
Пример прямого сжатия строки и распаковки полученных данных без использования промежуточных буферов:
package main
import (
"bytes"
"compress/flate"
"fmt"
"io"
)
func main() {
var compressed bytes.Buffer
writer, _ := flate.NewWriter(&compressed, flate.DefaultCompression)
writer.Write([]byte("abcde"))
writer.Close()
reader := flate.NewReader(&compressed)
decompressed, _ := io.ReadAll(reader)
reader.Close()
fmt.Println(string(decompressed))
}
Результат выполнения кода:
"abcde"
Смотрите также
-
пакет
compress/gzip,
который использует DEFLATE с дополнительными заголовками -
пакет
compress/zlib,
который также базируется на алгоритме DEFLATE -
пакет
compress/bzip2,
реализующий другой алгоритм сжатия -
пакет
compress/lzw,
реализующий алгоритм сжатия LZW