Если мы говорим о текстовых файлах, они легко могут быть встроены в исходный код. Просто используйте обратные кавычки, чтобы объявить литерал string
следующим образом:
const html = `
Example embedded HTML content.
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Совет по оптимизации:
. В большинстве случаев вам нужно будет только записать ресурс в io.Writer
, вы также можете сохранить результат преобразования []byte
:
var html = []byte(`
Example...
`)
// Sending it:
w.Write(html) // w is an io.Writer
Единственное, о чем вы должны быть осторожны, это то, что необработанные строковые литералы не могут содержать символ обратной цитаты (`). Необработанные строковые литералы не могут содержать последовательности (в отличие от интерпретируемых строковых литералов), поэтому, если текст, который вы хотите внедрить, содержит обратные кавычки, вам нужно разбить исходный строковый литерал и объединить кавычки в качестве интерпретированных строковых литералов, как в этом примере:
var html = `This is a back quote followed by a dot: ` + "`" + `.
`
Производительность не изменяется, так как эти конкатенации будут выполняться компилятором.
Для двоичных файлов (например, изображений) наиболее компактных (в отношении результирующего нативного двоичного файла) и наиболее эффективных было бы иметь содержимое файла как []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}
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 = ""
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:;<=>?")
Если ваши файлы находятся в корневом каталоге, то это не posts
, а pages
.
Вы можете перемещаться по такому пространству имен, как: {% for page in site.pages %}
Как подсказывает @marcanuy, я бы положил ваши файлы в каталог _pages
. Обязательно добавьте include: ['_pages']
к настройкам вашей сборки в _config.yml
. Теперь вы можете просматривать страницы с помощью {% for page in site.pages %}
. Это все еще оставляет проблему получения всех заголовков. Когда я создавал TOC определенного типа в jekyll, я нашел этот фрагмент кода очень полезным. Вы можете использовать элементы оттуда.
Базовая версия того, что вы хотите, будет следующей. Вам придется настроить это на основе вашей настройки, но она должна делать то, что вы хотите. Вы можете поместить это в отдельный HTML-документ в _includes
или поместить прямо в вашу панель навигации.
{% for page in site.pages %}
<ul>
{% assign headers = page.content | split: '<h' %}
{% for header in headers %}
{% assign _string = header | split: '</h' %}
{% capture _hAttrToStrip %}{{ _string[0] | split: '>' | first }}>{% endcapture %}
{% assign title = _string[0] | replace: _hAttrToStrip, '' %}
{% assign _idstring = header | split: 'id="' %}
{% assign _idstring = _idstring[1] | split: '"' %}
{% assign html_id = _idstring[0] %}
<li>
<a href={{page.url}}#{{html_id}}>{{title}}</a>
</li>
{% endfor %}
</ul>
{% endfor %}
Надеюсь, это поможет!