Функция шаблона Golang возвращает пустую страницу - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь изменить разделители по умолчанию для шаблонов Golang hml, и вот код, который я использую сейчас:

func indexHandler(w http.ResponseWriter, r *http.Request) {
  pageFile := "html/testpage.html"
  tmpl, err := template.New(pageFile).Delims("[[", "]]").ParseFiles(pageFile)
  //tmpl := template.Must(template.ParseFiles(pageFile))
  if (err!=nil){
    fmt.Println("Error")
    fmt.Println(err)
  }

  tmpl.Execute(w, nil)
}

Приведенный выше код отображает пустую страницу в браузере. Он будет правильно отображаться, если я буду использовать закомментированный код вместо второй строки.

Вот источник шаблона страницы:

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">

  <title>The HTML5 </title>
  <meta name="description" content="HTML5">
  <meta name="author" content="Test">   
</head>    
<body>
  This is html page
</body>
</html>

Моя версия go: go version go1.10.2 linux/amd64

Я запускаю его, go run test.go test.go находится в основном пакете

В браузере или терминале отсутствует сообщение об ошибке.

Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

После некоторых исследований и дискуссий, я думаю, эта строка плохо сформирована:

tmpl, err := template.New(pageFile).ParseFiles(pageFile)

Вам не нужно делать New(pageFile). Вам нужно только напрямую использовать метод ParseFiles и помнить, что имена шаблонов будут равны базовым именам передаваемых файлов.

Итак, коснитесь немного кода и используйте:

tmpl, err := template.ParseFiles(pageFile)

См. этот пример , чтобы узнать больше

0 голосов
/ 26 июля 2019
func indexHandler(w http.ResponseWriter, r *http.Request) {
  pageFile := "html/testpage.html"
  name := "testpage"
  tmpl, err := template.New(name).Delims("[[", "]]").ParseFiles(pageFile)  //only translate a "name" to New()
  //tmpl := template.Must(template.ParseFiles(pageFile))
  if (err!=nil){
    fmt.Println("Error")
    fmt.Println(err)
  }

  tmpl.Execute(w, nil)
  //tmpl.ExecuteTemplate(w, name, nil)
}
0 голосов
/ 16 мая 2018

Поскольку html/template использует text/template внизу, вы часто можете найти дополнительную информацию о том, как работают шаблоны в пакете text/template.

Из документов ParseFiles :

Поскольку шаблоны, созданные ParseFiles, называются base names из файлов аргументов, t обычно должен иметь имя одного из (базовые) имена файлов. Если это не так, в зависимости от содержимого т перед вызовом ParseFiles t.Execute может завершиться с ошибкой . В этом случае используйте t.ExecuteTemplate для выполнения допустимого шаблона.

(акцент мой)


Проблема вызвана тем, что вы передаете путь к файлу шаблона в качестве имени шаблона, а затем вызываете метод ParseFiles.

Из-за того, как реализованы ParseFiles и ParseGlob, это вызывает несоответствие между именем, которое вы явно передали New, и именами эти два метода назначают анализируемым шаблонам.

Вы можете проверить это, вызвав метод DefinedTemplates.

https://play.golang.org/p/LEi-xSn4LOF


Также, пожалуйста, посмотрите на @ icza's Go имя шаблона ответа , чтобы лучше понять шаблоны.

...