Как сжать файл?

В языке программирования Go для сжатия файлов существует пакет compress с подпакетами gzip, flate и zlib, которые предоставляют функциональность для работы с различными алгоритмами сжатия.

Одним из самых популярных алгоритмов сжатия в Go является алгоритм Gzip. Для сжатия файла можно воспользоваться функцией gzip.NewWriter. Вот пример кода, который сжимает содержимое файла input.txt и записывает его в файл compressed.txt.gz:

package main

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

func main() {
	inputFile, err := os.Open("input.txt")
	if err != nil {
		panic(err)
	}
	defer inputFile.Close()

	outputFile, err := os.Create("compressed.txt.gz")
	if err != nil {
		panic(err)
	}
	defer outputFile.Close()

	gzipWriter := gzip.NewWriter(outputFile)
	defer gzipWriter.Close()

	_, err = io.Copy(gzipWriter, inputFile)
	if err != nil {
		panic(err)
	}
}

Здесь мы открываем файл input.txt для чтения и файл compressed.txt.gz для записи. Затем мы создаем gzip.Writer, который предоставляет возможность сжатия данных, и оборачиваем его в io.Copy, чтобы копировать содержимое inputFile в gzipWriter. Это приведет к сжатию данных и их записи в outputFile.

Если вы хотите использовать другой алгоритм сжатия, например, алгоритм Deflate, можно воспользоваться подпакетом flate. Вот пример, который демонстрирует сжатие файла с использованием алгоритма Deflate:

package main

import (
	"compress/flate"
	"io"
	"os"
)

func main() {
	inputFile, err := os.Open("input.txt")
	if err != nil {
		panic(err)
	}
	defer inputFile.Close()

	outputFile, err := os.Create("compressed.txt")
	if err != nil {
		panic(err)
	}
	defer outputFile.Close()

	flateWriter, err := flate.NewWriter(outputFile, flate.DefaultCompression)
	if err != nil {
		panic(err)
	}
	defer flateWriter.Close()

	_, err = io.Copy(flateWriter, inputFile)
	if err != nil {
		panic(err)
	}
}

Здесь мы используем функцию flate.NewWriter, чтобы создать flate.Writer с заданным уровнем сжатия flate.DefaultCompression. Затем мы копируем содержимое inputFile в flateWriter, что приводит к сжатию данных и их записи в outputFile.

В отличие от алгоритма Gzip, алгоритм Deflate не поддерживает напрямую запись сжатых данных в архивный файл.