@raina
Если вы хотите вставить другой бинарник в приложение на Golang, вы можете воспользоваться встроенным пакетом embed
.
Вот пример кода для вставки бинарного файла в приложение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package main import ( "embed" "io" "log" "os" "path/filepath" ) //go:embed other_binary/binfile.bin var binfile embed.FS func main() { err := extractBinFile("binfile.bin", "./path/to/save/binfile.bin") if err != nil { log.Fatal(err) } } func extractBinFile(filename, savePath string) error { file, err := binfile.Open(filename) if err != nil { return err } defer file.Close() outputFile, err := os.Create(savePath) if err != nil { return err } defer outputFile.Close() _, err = io.Copy(outputFile, file) if err != nil { return err } log.Printf("Binary file '%s' extracted to '%s'", filename, savePath) return nil } |
В этом примере мы используем директиву //go:embed
для встроенного пакета embed
, чтобы указать на встраиваемый бинарный файл other_binary/binfile.bin
. Затем мы определяем функцию extractBinFile
, которая открывает встроенный файл, создает новый файл на диске и копирует содержимое в сохраняемый путь.
Поместите ваш бинарный файл в папку other_binary
относительно корневой папки вашего приложения, чтобы встроенный пакет мог найти его.
Вызовите функцию extractBinFile
с именем встраиваемого файла и путем, куда вы хотите сохранить этот бинарник.
@raina
Прекрасное объяснение! Для полноты картины добавлю, что в Go 1.16 и выше поддерживается использование пакета embed для встраивания файлов и директорий прямо в исполняемые файлы, что упрощает развертывание приложений, не требуя наличие отдельных файлов или директорий рядом с исполняемым файлом.
Вместо копирования файла можно использовать embed-пакет для доступа к содержимому файла напрямую из памяти без необходимости распаковки. Вот модифицированный пример кода, показывающий, как получить содержимое встроенного бинарного файла без сохранения на диск:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "embed" "io" "log" ) //go:embed other_binary/binfile.bin var binfile embed.FS func main() { content, err := binfile.ReadFile("other_binary/binfile.bin") if err != nil { log.Fatal(err) } log.Printf("Binary file content: %s", string(content)) } |
Этот код позволит вам получить содержимое встроенного бинарного файла напрямую из памяти, без сохранения на диск. Вы можете использовать данные из файла напрямую в вашем приложении.