Go embed: как включить файл в программу при сборке

Go embed: как включить файл в программу при сборке
Содержание статьи

Если небольшой шаблон или текст должен поставляться вместе с программой, пакет embed позволяет включить файл в результат сборки Go. Во время запуска отдельный файл для этого примера уже не требуется. На Mentoring.digital разберём структуру и проверку такого поведения.

Разместите исходник и ресурс рядом

Создайте отдельный учебный каталог. В нём нужны main.go и message.txt. В текстовый файл положите строку Hello from embedded file. Подготовьте исходник:

package main

import (
    _ "embed"
    "fmt"
)

//go:embed message.txt
var message string

func main() {
    fmt.Print(message)
}

Импорт embed нужен и при записи содержимого в string. Пустой идентификатор в импорте подходит, когда имя пакета дальше не используется. Директива располагается непосредственно перед объявлением переменной на уровне пакета.

Содержимое читается при сборке из каталога пакета или его подкаталогов. Это не чтение файла с произвольного диска при каждом запуске программы.

Проверьте собранную программу отдельно от исходников

В учебном каталоге выполните go build -o demo main.go. При необходимости используйте имя demo.exe для Windows. Нужны установленный Go и файл message.txt, доступный во время сборки.

Скопируйте исполняемый файл в другой временный каталог и запустите оттуда. Программа должна вывести встроенную строку без отдельного message.txt рядом с ней. Такой сценарий проверяет собранный результат, а не запуск исходника из исходной папки.

После изменения message.txt старая программа не обновится. Повторите сборку, чтобы встроить новое содержимое. Поэтому embed подходит для ресурсов версии приложения, а не для настроек, меняющихся независимо от выпуска.

Выберите тип и проверьте ограничения

Для одного файла доступны string и []byte. Для нескольких файлов можно использовать embed.FS с файловым интерфейсом только для чтения. В шаблонах директивы нельзя ссылаться на родительский каталог через .. или использовать абсолютный путь.

Не встраивайте пароли, рабочие токены и приватные конфигурации с секретами. Бинарный файл не становится защищённым хранилищем. Также оцените объём ресурсов и условия их использования.

Задание: встроить два текстовых шаблона через embed.FS, прочитать каждый по имени и обработать отсутствующее имя. Объясните, что произойдёт после изменения шаблонов без новой сборки.

Такие упражнения подходят для курса Go с практикой сборки приложений. Поставку ресурсов можно обсудить с ментором по Go.

Похожие статьи по данной теме