golang html / template ExecuteTemplate errant byte来自何处?

时间:2016-02-02 00:59:47

标签: html templates go lexer

背景 我试图为Go编写一些GZIP中间件,但遇到了一个问题,因为http.DetectContentType()返回text / plain而不是text / html,因此我将其跟踪到第一个正在写入的文本是某种排序或错误的字节,我仍然试图追查。我知道它有很多方法,比如显式设置ContentType或使用bytes.Buffer执行模板并一次写入所有内容,但我真的想知道导致这个单字节被写入的原因。

示例 这是一个非常人为的例子,显示了相同的问题https://play.golang.org/p/SSrWP9jLRq

运行时,您会看到打印的第一件事是:" LEN BYTES:1字符串:"

嫌疑人 如示例所示,该行" {{template" header" }}"在内容模板中是罪魁祸首,但为什么会输出这些额外的内容。

问题 有人知道这个错误字节的来源吗?请参阅示例中的html页眉,页脚和内容模板。

1 个答案:

答案 0 :(得分:1)

因为模板内容在define指令中的结束括号之后立即开始,所以根,页眉和页脚模板以换行符开头。

单个换行符在开始时写入,因为模板在调用子模板之前刷新输出。

将定义更改为以

开头
header = `{{define "header"}}<!DOCTYPE html>
...
content = `{{define "root"}}{{template "header" .}}

消除额外的换行符。

请参阅https://play.golang.org/p/AzD98cD7c0了解修复方法。