встраивать html-файлы в golang binary [duplicate]

Вы можете вставлять видео с тегом foreignobject


      
        
      
 

https://jsfiddle.net/vp2fhwy7/1/

79
задан Jimmy Sawczuk 16 December 2012 в 21:00
поделиться

4 ответа

Пакет go-bindata выглядит так, как будто вас интересует.

https://github.com/go-bindata/go-bindata

Это позволит вам преобразовать любой статический файл в вызов функции, который может быть встроен в ваш код и будет возвращать байтовый фрагмент содержимого файла при вызове.

66
ответ дан gimpf 22 August 2018 в 12:16
поделиться
  • 1
    Продвижение в моем случае кажется странным, но я все равно сделаю это: p Для записи, однако, это не пакет, а инструмент командной строки. – jimt 17 December 2012 в 00:36
  • 2
    Только для записи, это путь, который я взял с моим проектом. В какой-то момент @jimt представила некоторые новые функции, чтобы сделать вещи более удобными для пользователя, но больше не предоставляла необходимую мне гранулярность, поэтому я написал свой собственный инструмент, который имеет меньше возможностей, но предназначен для моей утилиты (я использую этот инструмент как своего рода преамбула к процессу сборки): github.com/jimmysawczuk/go-binary – Jimmy Sawczuk 21 January 2015 в 18:03

Вставка текстовых файлов

Если мы говорим о текстовых файлах, они легко могут быть встроены в исходный код. Просто используйте обратные кавычки, чтобы объявить литерал string следующим образом:

const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`

// Sending it:
w.Write([]byte(html))  // w is an io.Writer

Совет по оптимизации:

. В большинстве случаев вам нужно будет только записать ресурс в io.Writer , вы также можете сохранить результат преобразования []byte:

var html = []byte(`
<html><body>Example...</body></html>
`)

// Sending it:
w.Write(html)  // w is an io.Writer

Единственное, о чем вы должны быть осторожны, это то, что необработанные строковые литералы не могут содержать символ обратной цитаты (`). Необработанные строковые литералы не могут содержать последовательности (в отличие от интерпретируемых строковых литералов), поэтому, если текст, который вы хотите внедрить, содержит обратные кавычки, вам нужно разбить исходный строковый литерал и объединить кавычки в качестве интерпретированных строковых литералов, как в этом примере:

var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`

Производительность не изменяется, так как эти конкатенации будут выполняться компилятором.

Вставка двоичных файлов

Фиксация как байтового фрагмента

Для двоичных файлов (например, изображений) наиболее компактных (в отношении результирующего нативного двоичного файла) и наиболее эффективных было бы иметь содержимое файла как []byte в исходном коде. Это может быть создано сторонними toos / libraries, такими как go-bindata .

Если вы не хотите использовать стороннюю библиотеку для этого, вот простой фрагмент кода, который читает двоичный файл и выводит исходный код Go, который объявляет переменную типа []byte, которая будет инициализирована с точным содержимым файла:

imgdata, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}

fmt.Print("var imgdata = []byte{")
for i, v := range imgdata {
    if i > 0 {
        fmt.Print(", ")
    }
    fmt.Print(v)
}
fmt.Println("}")

Пример вывода, если файл будет содержать байты из 0 до 16 (попробуйте на Go Playground ):

var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

Хранение в качестве base64 string

Если файл не «слишком большой» «(большинство изображений / значков соответствуют критериям), есть и другие жизнеспособные варианты. Вы можете преобразовать содержимое файла в Base64 string и сохранить его в исходном коде. При запуске приложения (func init()) или при необходимости вы можете декодировать его до исходного []byte контента. Go имеет хорошую поддержку кодировки Base64 в пакете encoding/base64 .

Преобразование двоичного файла в base64 string выполняется так же, как:

data, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))

Сохраните строку result64 в исходном коде, например как const.

Декодирование это всего лишь один вызов функции:

const imgBase64 = "<insert base64 string here>"

data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte

Хранение как указано string

Более эффективно, чем сохранение в качестве base64 , но может быть более длинным в исходном коде, это сохранение строкового литерала , цитируемого двоичных данных. Мы можем получить цитированную форму любой строки, используя функцию strconv.Quote() :

data, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}
fmt.Println(strconv.Quote(string(data))

Для двоичных данных, содержащих значения от 0 до 64, это то, как будет выглядеть вывод (попробуйте на Go Playground ):

"\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"

(Обратите внимание, что strconv.Quote() добавляет и добавляет к нему кавычку.)

Вы можете напрямую использовать эту цитированную строку в своем исходном коде, например:

const imgdata = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"

Он готов к использованию, нет необходимости его декодировать; unquoting выполняется компилятором Go во время компиляции.

Вы также можете сохранить его в виде байтового фрагмента, если вам это нужно:

var imgdata = []byte("\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?")
27
ответ дан icza 22 August 2018 в 12:16
поделиться
  • 1
    есть ли способ связать файл sh с исполняемым файлом go? – Kasun Siyambalapitiya 9 November 2017 в 12:34
  • 2
    Я думаю, что данные должны быть imgdata в первом фрагменте кода под «хранением в виде байтового сегмента», раздел. – logical x 2 21 November 2017 в 18:55
  • 3
    @deusexmachina Ты прав, исправил это. Код на игровой площадке уже был прав. – icza 21 November 2017 в 19:05
  • 4
    Фактически, это первый раз, когда я видел этот способ («хранение как байтовый срез») встраивания двоичного файла в исходный код. Довольно аккуратно:) – logical x 2 21 November 2017 в 22:00

также существует некоторый экзотический способ - я использую maven plugin для создания проектов GoLang и позволяет использовать препроцессор JCP для встраивания двоичных блоков и текстовых файлов в источники. В коде кода просто выглядит строка ниже (, а некоторые примеры можно найти здесь )

var imageArray = []uint8{/*$binfile("./image.png","uint8[]")$*/}
2
ответ дан Igor Maznitsa 22 August 2018 в 12:16
поделиться
  • 1
    @ можно связать каталог, имеющий sh или исполняемый файл, как указано выше – Kasun Siyambalapitiya 9 November 2017 в 12:36
  • 2
    @ KasunSiyambalapitiya Привязать каталог? Привязать файл sh? Не уверен, что вы имеете в виду. Если вы хотите, чтобы все в каталоге было встроено, это то, что я сделал с go-bindata. Например, если я помещаю //go:generate $GOPATH/bin/go-bindata -prefix=data/ -pkg=$GOPACKAGE data/ в файл (не сгенерированный) go, go generate ./... будет запускать go-bindata в каталоге пакета, вставляя все в поддиремент данных, но с удаленным префиксом «data /». – Mark 26 November 2017 в 06:16
0
ответ дан robx 5 November 2018 в 09:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: