为了账号安全,请及时绑定邮箱和手机立即绑定

golang html/template ExecuteTemplate 错误字节来自哪里?

golang html/template ExecuteTemplate 错误字节来自哪里?

Go
呼唤远方 2021-12-07 17:16:46
背景 我试图为 Go 编写一些 GZIP 中间件,但遇到了一个问题,因为 http.DetectContentType() 返回的是 text/plain 而不是 text/html,所以我追踪到第一个被写入的文本是某种类型或错误的字节,我仍在努力追查。我知道有很多方法可以解决这个问题,比如显式设置 ContentType 或在执行模板时使用 bytes.Buffer 并一次写入,但我真的很想找出导致写入这个单个字节的原因。示例 这是一个非常人为的示例,显示了相同的问题https://play.golang.org/p/SSrWP9jLRq运行时,您将看到打印的第一件事是:“LEN BYTES: 1 String:”嫌疑人 如示例所示,内容模板中的这一行 "{{template "header" .}}" 似乎是罪魁祸首,但为什么会输出这些额外的内容。问题 有人知道这个错误的字节来自哪里吗?请参阅示例中的 html 页眉、页脚和内容模板。
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

因为模板内容紧跟在定义指令中的右大括号之后开始,所以根、页眉和页脚模板以换行符开始。


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


更改定义以开始


header = `{{define "header"}}<!DOCTYPE html>

...

content = `{{define "root"}}{{template "header" .}}

以消除额外的换行符。有关修复,请参阅https://play.golang.org/p/AzD98cD7c0。


在 Go 1.6 或更高版本中,在操作末尾添加减号以修剪操作后的空格:


    header = `{{define "header" -}}

<!DOCTYPE html>

...


    content = `{{define "root" -}}

{{template "header" .}}

...

在动作的开头添加一个减号以修剪动作之前的空格。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信