Подтвердить что ты не робот

Функция шаблона Go

Он заметил странную вещь с шаблонами Go, когда я пытаюсь использовать Funcs и FuncMap. Следующий код работает так, как ожидалось:

buffer := bytes.NewBufferString("")

funcMap := template.FuncMap{
    "label": strings.Title,
}

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "")

return string(buffer.Bytes()) //=> "Alex"

Но когда я пытаюсь поместить шаблон в файл, он не работает (Execute() говорит: "alex" is an incomplete or empty template):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

С template.html:

{{label \"alex\"}}

Любая идея, почему? Это ошибка? Существуют ли более простые способы использования методов/функций в шаблонах?

4b9b3361

Ответ 1

ParseFiles, вероятно, может использовать лучшую документацию. Объект шаблона может иметь несколько шаблонов в нем, и каждый из них имеет имя. Если вы посмотрите на реализацию ParseFiles, вы увидите, что он использует имя файла как имя шаблона внутри объекта шаблона. Итак, назовите свой файл так же, как и объект шаблона (возможно, не совсем практичный), либо используйте ExecuteTemplate вместо Execute.

Ответ 2

Ответ Соня технически правилен, но меня еще больше смущает. Вот как я в конечном итоге получил его работу:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html")
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
    return
}
err = t.Execute(w, data)
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
}

Имя шаблона - это голое имя файла шаблона, а не полный путь. Execute выполнит шаблон по умолчанию при условии, что он назван для соответствия, поэтому нет необходимости использовать ExecuteTemplate.

В этом случае файл _base.html является самым внешним контейнером, например:

<!DOCTYPE html>
<html><body>
<h1>{{ template "title" }}</h1>
{{ template "content" }}
</body></html>

while home.html определяет конкретные части:

{{ define "title" }}Home{{ end }}

{{ define "content" }}
Stuff
{{ end }}