Вставлення текстових файлів
Якщо ми говоримо про текстові файли, вони легко вбудовуються у сам вихідний код. Просто використовуйте зворотні лапки, щоб оголосити 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у вихідному коді. Це може бути створено сторонніми бібліотеками / бібліотеками, такими як 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 ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Зберігання як основи64 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))
Збережіть результат 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:;<=>?")