背景 我试图为Go编写一些GZIP中间件,但遇到了一个问题,因为http.DetectContentType()返回text / plain而不是text / html,因此我将其跟踪到第一个正在写入的文本是某种排序或错误的字节,我仍然试图追查。我知道它有很多方法,比如显式设置ContentType或使用bytes.Buffer执行模板并一次写入所有内容,但我真的想知道导致这个单字节被写入的原因。
示例 这是一个非常人为的例子,显示了相同的问题https://play.golang.org/p/SSrWP9jLRq
运行时,您会看到打印的第一件事是:" LEN BYTES:1字符串:"
嫌疑人 如示例所示,该行" {{template" header" }}"在内容模板中是罪魁祸首,但为什么会输出这些额外的内容。
问题 有人知道这个错误字节的来源吗?请参阅示例中的html页眉,页脚和内容模板。
答案 0 :(得分:1)
因为模板内容在define指令中的结束括号之后立即开始,所以根,页眉和页脚模板以换行符开头。
单个换行符在开始时写入,因为模板在调用子模板之前刷新输出。
将定义更改为以
开头header = `{{define "header"}}<!DOCTYPE html>
...
content = `{{define "root"}}{{template "header" .}}
消除额外的换行符。
请参阅https://play.golang.org/p/AzD98cD7c0了解修复方法。