3

我遇到了一个非常烦人的问题,我花了大约一个小时才弄清楚导致问题的原因,但我不知道为什么:

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.

由于没有提供任何信息,定位问题已经生效,但为什么会出现这种情况?一个未完成的标签怎么会导致这样的问题?以及如何调试?

4

2 回答 2

6

它告诉你错误,你只是忽略它。

如果您查看 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上的(打印错误)

在这里,固定在操场上

于 2015-03-14T16:20:07.483 回答
3

Go 的模板包提供了一种方法Must,可以让你的程序在出现此类错误时快速失败。您可以将代码从一些错误检查中解放出来,但您仍然可以控制。

t := template.Must(template.parseFiles("template/index.tmpl"))
于 2015-03-14T16:26:39.460 回答