Почему закрытый html-тег заставляет html-шаблон не рендериться в go?

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

я использую html/template чтобы разрисовать веб-страницу и код выглядит так:

t, _ := template.parseFiles("template/index.tmpl")
...
t.Execute(w, modelView) // w is a http.ResponseWriter and modelView is a data struct.

Но неосознанно я допустил ошибку, оставив <textarea> тег открыт:

<html>
<body>
        <form id="batchAddUser" class="form-inline">
        **this one**  -->  <textarea name="users" value="" row=3 placeholder="input username and password splited by space">
            <button type="submit" class="btn btn-success" >Add</button>
        </form>
</body>
</html>

И тогда Go не дает никаких исключений и других подсказок, а просто дает пустую страницу с пустыми данными, и код состояния 200,

Это помогает найти проблему, поскольку никакой информации не было предложено, но почему это происходит? Почему незаполненный тег вызывает такую ​​проблему? И как это отладить?

2 ответа

Он говорит вам об ошибке, вы просто игнорируете ее.

Если вы посмотрите на ошибку, возвращаемую Execute, она скажет вам, что ваш html плох.

Вы должны всегда проверять на ошибки. Что-то вроде:

t, err := template.New("test").Parse(ttxt)
if err != nil { 
    ...do something with error...
}
err = t.Execute(os.Stdout, nil) // w is a http.R
if err != nil { 
    ...do something with error...
}

Вот оно (с ошибкой печати) на детской площадке

Вот оно, исправлено на детской площадке

Шаблонный пакет Go предоставляет метод Must это приведет к быстрому провалу вашей программы из-за паники в случае таких ошибок. Вы можете освободить свой код от некоторых проверок ошибок, но вы все равно будете контролировать его.

t := template.Must(template.parseFiles("template/index.tmpl"))
Другие вопросы по тегам