Различное поведение для функций ParseFiles в html/template

Я не понимаю, почему поведение func (t * Template) Parsefiles (... отличается от func ParseFiles (... ). Обе функции взяты из "html/шаблон ".

package example

import (
    "html/template"
    "io/ioutil"
    "testing"
)

func MakeTemplate1(path string) *template.Template {
    return template.Must(template.ParseFiles(path))
}

func MakeTemplate2(path string) *template.Template {
    return template.Must(template.New("test").ParseFiles(path))
}

func TestExecute1(t *testing.T) {
    tmpl := MakeTemplate1("template.html")

    err := tmpl.Execute(ioutil.Discard, "content")
    if err != nil {
        t.Error(err)
    }
}

func TestExecute2(t *testing.T) {
    tmpl := MakeTemplate2("template.html")

    err := tmpl.Execute(ioutil.Discard, "content")
    if err != nil {
        t.Error(err)
    }
}

Это завершает ошибку:

--- FAIL: TestExecute2 (0.00 seconds)
    parse_test.go:34: html/template:test: "test" is an incomplete or empty template
FAIL
exit status 1

Обратите внимание, что TestExecute1 прошел отлично, поэтому это не проблема с template.html .

Что здесь происходит?
Что мне не хватает в MakeTemplate2 ?

3
nl ja de

1 ответы

Это из-за имен шаблонов. Объект Template может содержать несколько табличек, у каждого есть имя. При использовании template.New ("test") , а затем, выполняя его, он попытается выполнить шаблон, указанный "test" внутри этого шаблона. Однако tmpl.ParseFiles сохраняет шаблон в имени файла. Это объясняет сообщение об ошибке.

Как это исправить:

a) Дайте шаблону правильное имя: использование

return template.Must(template.New("template.html").ParseFiles(path))

вместо

return template.Must(template.New("test").ParseFiles(path))

b) Укажите, какой шаблон вы хотите выполнить в своем Template : использование

err := tmpl.ExecuteTemplate(ioutil.Discard, "template.html", "content")

вместо

err := tmpl.Execute(ioutil.Discard, "content")

Read more about this in http://golang.org/pkg/text/template/

9
добавлено
Итак, почему TestExecute1 работает правильно? Если я вас понимаю, ему будет дано неявное имя template.html . Но я не использую ExecuteTemplate , и он отлично работает.
добавлено автор deft_code, источник
точно, имя template.html будет указываться неявно, поэтому он выполняет правильный шаблон в объекте.
добавлено автор keks, источник
Go, go!
Go, go!
2 417 участник(ов)

Русскоязычная группа, посвящённная Golang. Для вакансий: @gogetajob Правила: #gogorules О вакансиях: #go_вакансия_правила Не приветствуются: - оскорбления - nsfw контент - флуд, флейм и спам - избыток оффтоп тем - политика Тиран чатика: @twentydraft

Golang Jobs and Freelance
Golang Jobs and Freelance
760 участник(ов)

Jobs and freelance for golang developers See also @golangjobfeed

Go Get A Job
Go Get A Job
501 участник(ов)

Филиал @gogolang Тираны чатика те же :)