Как результат кодогенераций сохранить в архив и сразу его отдать?

В Go для сохранения результатов кодогенерации в архив и последующего его отдачи можно воспользоваться стандартными пакетами archive/zip и net/http.

Первым шагом необходимо создать архив и добавить в него нужные файлы. Для этого применяется пакет archive/zip. Ниже приведен пример кода, демонстрирующий этот процесс:

package main

import (
	"archive/zip"
	"fmt"
	"io"
	"os"
)

func main() {
	// Создаем новый архив для сохранения результатов
	zipFile, err := os.Create("results.zip")
	if err != nil {
		fmt.Println("Ошибка при создании архива:", err)
		return
	}
	defer zipFile.Close()

	// Создаем новый архиватор
	zipWriter := zip.NewWriter(zipFile)
	defer zipWriter.Close()

	// Добавляем файлы в архив
	file1, err := os.Open("file1.txt")
	if err != nil {
		fmt.Println("Ошибка при открытии файла:", err)
		return
	}
	defer file1.Close()

	// Создаем новое имя файла в архиве
	file1InZip, err := zipWriter.Create("file1.txt")
	if err != nil {
		fmt.Println("Ошибка при добавлении файла в архив:", err)
		return
	}

	// Копируем содержимое файла в архив
	_, err = io.Copy(file1InZip, file1)
	if err != nil {
		fmt.Println("Ошибка при копировании файла в архив:", err)
		return
	}

	// Повторяем те же шаги для остальных файлов, если необходимо

	fmt.Println("Архив успешно создан")
}

В этом примере создается новый архив с именем "results.zip" и добавляется файл "file1.txt" в архив с тем же именем. Вы можете повторять аналогичные шаги для добавления других файлов в архив.

После создания архива вы можете использовать пакет net/http для его отдачи по HTTP. Пример ниже показывает, как отдать архив при обработке запроса:

package main

import (
	"io"
	"net/http"
	"os"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		// Открываем архив для чтения
		zipFile, err := os.Open("results.zip")
		if err != nil {
			http.Error(w, "Ошибка при открытии архива", http.StatusInternalServerError)
			return
		}
		defer zipFile.Close()

		// Отдаем архив как ответ на запрос
		w.Header().Set("Content-Type", "application/zip")
		w.Header().Set("Content-Disposition", "attachment; filename=results.zip")

		_, err = io.Copy(w, zipFile)
		if err != nil {
			http.Error(w, "Ошибка при отправке архива", http.StatusInternalServerError)
			return
		}
	})

	http.ListenAndServe(":8080", nil)
}

В этом примере создается обработчик для корневого пути "/", который открывает архив "results.zip" и отправляет его в качестве ответа на запрос. Заголовки Content-Type и Content-Disposition установлены для указания типа контента и файла, который будет скачан.

Вы можете запустить этот код на сервере и обратиться к нему через веб-браузер для загрузки архива "results.zip".