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

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

Я использую 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.

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


person armnotstrong    schedule 14.03.2015    source источник
comment
Go не имеет исключений. Вы игнорируете ошибки, выполняя t, _ := ....   -  person maerics    schedule 14.03.2015


Ответы (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...
}

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

Вот оно, исправлено на Playground

person David Budworth    schedule 14.03.2015
comment
Обратите внимание, что перехват ошибки из t.Execute ставит вас в затруднительное положение — уже слишком поздно показывать пользователю ошибку, так как http.ResponseWriter тоже уже написан. Обычный способ справиться с этим — создать пул буферов, в который вы записываете (и в случае сбоя отправить HTTP 500), а затем io.Copy(w, bufpool) записать исполняемый шаблон. - person elithrar; 15.03.2015

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

t := template.Must(template.parseFiles("template/index.tmpl"))
person Grzegorz Żur    schedule 14.03.2015