Встраивание текстовых файлов
Если мы говорим о текстовых файлах, их можно легко встроить в сам исходный код. Просто используйте обратные кавычки, чтобы объявить 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 / библиотеками, такими как 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
содержимое. В encoding/base64
пакете Go есть хорошая поддержка кодировки Base64 .
Преобразование (двоичного) файла в base64 string
так же просто, как:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Сохраните строку результата base64 в исходном коде, например, как файл 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:;<=>?"
Готово к использованию, расшифровывать не нужно; снятие кавычек выполняется компилятором 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:;<=>?")