error: template: "..." является неполным или пустым шаблоном
Я пытаюсь добавить FuncMap
к моим шаблонам, но я получаю следующую ошибку:
template: "foo" является неполным или пустым шаблоном
Разбор шаблонов работал отлично, прежде чем я использовал FuncMap
, поэтому я не уверен, почему он сейчас бросает ошибку.
Вот мой код:
funcMap := template.FuncMap{
"IntToUSD": func(num int) string {
return decimal.New(int64(num), 2).String()
},
}
// ...
tmpl, err := template.New(t.file).Funcs(funcMap).ParseFiles(t.files()...)
if err != nil {
// ...
}
t.files()
просто возвращает фрагмент строк, которые являются файловыми путями.
Кто-нибудь знает, что?
Ответы
Ответ 1
Убедитесь, что аргумент вы передаете template.New
является базовым именем одного из файлов в списке, вы передаете ParseFiles
.
Один из вариантов
files := t.files()
if len(files) > 0 {
name := path.Base(files[0])
tmpl, err := template.New(name).Funcs(funcMap).ParseFiles(files...)
Документация ParseFiles:
Поскольку шаблоны, созданные ParseFiles, называются базовыми именами файлов аргументов, t обычно должен иметь имя одного из (базовых) имен файлов.
Ответ 2
У меня была такая же проблема. Я понял, что
tmpl, err := template.New("").Funcs(funcMap).ParseFiles("fileName")
также работает, если вы используете его с
err := tpl.ExecuteTemplate(wr, "fileName", data)
Если я использую
err := tpl.Execute(wr, data)
тогда я должен указать имя шаблона в New()
:
tmpl, err := template.New("fileName").Funcs(funcMap).ParseFiles("fileName")