golang html/template ExecuteTemplate errant byte 它来自哪里?
golang html/template ExecuteTemplate errant byte where is it coming from?
背景
我试图为 Go 编写一些 GZIP 中间件,但是 运行 遇到了问题,因为 http.DetectContentType() 返回的是 text/plain 而不是 text/html 所以我追踪到了第一个正在写入的文本是某种类型或 er运行t 字节,我仍在努力追查。我知道有很多解决方法,比如在执行模板时显式设置 ContentType 或使用 bytes.Buffer 并一次写入所有内容,但我真的很想找出导致写入此单个字节的原因。
例子
这是一个非常人为的例子,它显示了同样的问题 https://play.golang.org/p/SSrWP9jLRq
当 运行 时,您将看到打印的第一件事是:"LEN BYTES: 1 String: "
嫌疑人
如示例所示,内容模板中的这一行“{{template "header" .}}”似乎是罪魁祸首,但为什么它会输出这些额外的内容。
问题
有人知道这个 er运行t 字节是从哪里来的吗?请参阅示例中的 html 页眉、页脚和内容模板。
因为模板内容紧跟在 define 指令中的右大括号之后,所以根模板、页眉模板和页脚模板以换行符开头。
单个换行符写在开头,因为模板在调用子模板之前刷新输出。
更改定义以
开头
header = `{{define "header"}}<!DOCTYPE html>
...
content = `{{define "root"}}{{template "header" .}}
消除多余的换行符。请参阅 https://play.golang.org/p/AzD98cD7c0 进行修复。
在 Go 1.6 或更高版本中,在动作末尾添加一个减号到动作后面的 trim 空白处:
header = `{{define "header" -}}
<!DOCTYPE html>
...
content = `{{define "root" -}}
{{template "header" .}}
...
在动作的开头添加一个减号到动作之前的 trim 空格。
背景 我试图为 Go 编写一些 GZIP 中间件,但是 运行 遇到了问题,因为 http.DetectContentType() 返回的是 text/plain 而不是 text/html 所以我追踪到了第一个正在写入的文本是某种类型或 er运行t 字节,我仍在努力追查。我知道有很多解决方法,比如在执行模板时显式设置 ContentType 或使用 bytes.Buffer 并一次写入所有内容,但我真的很想找出导致写入此单个字节的原因。
例子 这是一个非常人为的例子,它显示了同样的问题 https://play.golang.org/p/SSrWP9jLRq
当 运行 时,您将看到打印的第一件事是:"LEN BYTES: 1 String: "
嫌疑人 如示例所示,内容模板中的这一行“{{template "header" .}}”似乎是罪魁祸首,但为什么它会输出这些额外的内容。
问题 有人知道这个 er运行t 字节是从哪里来的吗?请参阅示例中的 html 页眉、页脚和内容模板。
因为模板内容紧跟在 define 指令中的右大括号之后,所以根模板、页眉模板和页脚模板以换行符开头。
单个换行符写在开头,因为模板在调用子模板之前刷新输出。
更改定义以
开头header = `{{define "header"}}<!DOCTYPE html>
...
content = `{{define "root"}}{{template "header" .}}
消除多余的换行符。请参阅 https://play.golang.org/p/AzD98cD7c0 进行修复。
在 Go 1.6 或更高版本中,在动作末尾添加一个减号到动作后面的 trim 空白处:
header = `{{define "header" -}}
<!DOCTYPE html>
...
content = `{{define "root" -}}
{{template "header" .}}
...
在动作的开头添加一个减号到动作之前的 trim 空格。