背景 我試圖為 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" .}}
...
在動作的開頭添加一個減號以修剪動作之前的空格。
- 1 回答
- 0 關注
- 272 瀏覽
添加回答
舉報
0/150
提交
取消