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")