Пакет compress/gzip
Пакет compress/gzip реализует сжатие и распаковку данных в формате gzip.
Он предоставляет два основных типа: Writer для записи сжатых данных и
Reader для чтения распакованных данных. В первый параметр конструкторов
передается базовый поток ввода-вывода, во второй (при наличии) - уровень сжатия.
Пакет поддерживает стандартные уровни сжатия от BestSpeed до
BestCompression, включая DefaultCompression и
NoCompression.
Создание gzip-архива
Для создания gzip-архива используется функция NewWriter,
которая принимает объект, реализующий интерфейс io.Writer.
Давайте создадим файл с gzip-сжатыми данными:
package main
import (
"compress/gzip"
"fmt"
"os"
)
func main() {
file, err := os.Create("data.gz")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
gw := gzip.NewWriter(file)
defer gw.Close()
_, err = gw.Write([]byte("Hello, gzip compression!"))
if err != nil {
fmt.Println("Error writing data:", err)
return
}
fmt.Println("Data compressed successfully")
}
Результат выполнения кода:
"Data compressed successfully"
Распаковка gzip-архива
Для распаковки используется функция NewReader, которая
принимает объект, реализующий интерфейс io.Reader.
Рассмотрим пример чтения данных из gzip-архива:
package 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()
gr, err := gzip.NewReader(file)
if err != nil {
fmt.Println("Error creating reader:", err)
return
}
defer gr.Close()
data, err := io.ReadAll(gr)
if err != nil {
fmt.Println("Error reading data:", err)
return
}
fmt.Println(string(data))
}
Результат выполнения кода:
"Hello, gzip compression!"
Настройка уровня сжатия
Функция NewWriterLevel позволяет задать уровень сжатия
при создании архива. Уровень сжатия указывается вторым параметром
и может принимать значения от 1 до 9, где 9 - максимальное сжатие,
а 1 - максимальная скорость. Рассмотрим пример использования
различных уровней сжатия:
package main
import (
"compress/gzip"
"fmt"
"os"
)
func main() {
file, err := os.Create("data_fast.gz")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
gw, err := gzip.NewWriterLevel(file, gzip.BestSpeed)
if err != nil {
fmt.Println("Error creating writer:", err)
return
}
defer gw.Close()
_, err = gw.Write([]byte("Fast compression example"))
if err != nil {
fmt.Println("Error writing data:", err)
return
}
fmt.Println("Compressed with BestSpeed")
}
Результат выполнения кода:
"Compressed with BestSpeed"
Работа с потоками данных
Пакет compress/gzip позволяет работать с данными как
с потоком, что удобно при обработке больших объемов информации
без необходимости загрузки всех данных в память. Давайте создадим
программу, которая сжимает данные из одного файла и записывает
их в другой:
package main
import (
"compress/gzip"
"fmt"
"io"
"os"
)
func main() {
src, err := os.Open("input.txt")
if err != nil {
fmt.Println("Error opening source:", err)
return
}
defer src.Close()
dst, err := os.Create("output.gz")
if err != nil {
fmt.Println("Error creating destination:", err)
return
}
defer dst.Close()
gw := gzip.NewWriter(dst)
defer gw.Close()
_, err = io.Copy(gw, src)
if err != nil {
fmt.Println("Error copying data:", err)
return
}
fmt.Println("Data compressed successfully")
}
Результат выполнения кода:
"Data compressed successfully"
Смотрите также
-
функцию
gzip.NewReader,
которая создает новый Reader для распаковки gzip-данных -
функцию
gzip.NewWriter,
которая создает новый Writer для сжатия данных в формат gzip -
функцию
gzip.NewWriterLevel,
которая создает Writer с заданным уровнем сжатия -
пакет
compress/zlib,
который реализует сжатие в формате zlib