You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang html/template模板如何让<br/>标签正常渲染不被转义

问题原因

Go标准库的html/template包默认会对所有字符串类型的变量做HTML转义,避免XSS注入风险,所以你写入的<br/>标签会被转义为&lt;br/&gt;实体字符,浏览器只会原样输出不会解析为换行。你之前使用template.HTMLEscapeString处理内容的操作反而会进一步加剧转义效果,自然无法达到预期。

解决方案

按你的使用场景可以选择两种方案:

场景1:你完全确定Body内容无恶意代码(无用户输入内容)

直接将需要渲染HTML标签的字段类型改为template.HTML即可,模板不会对该类型的内容做转义处理。
修改示例:

  1. 结构体定义修改:
type Page struct {
    // 其他字段保持不变
    Body template.HTML // 从string类型改为template.HTML类型
}

// 赋值时直接转成template.HTML类型
page.Body = template.HTML("Some text.<br/>More text")

你提供的复现代码对应修改Data结构体即可:

type Data struct {
    Field1 template.HTML
    Field2 template.HTML
    Field3 template.HTML
}
// 赋值时转类型
data.Field1 = template.HTML("Some text<br/>More text")

场景2:Body包含用户输入的内容,需要避免XSS风险

推荐自定义模板函数nl2br,先对原始内容做HTML转义,再将换行符\n替换为<br/>标签,既保证安全又能实现换行效果:

  1. 首先定义转换函数:
import "strings"

func nl2br(s string) template.HTML {
    // 先转义所有HTML特殊字符,避免XSS注入
    escaped := template.HTMLEscapeString(s)
    // 替换换行符为br标签
    return template.HTML(strings.ReplaceAll(escaped, "\n", "<br/>"))
}
  1. 解析模板前注册自定义函数:
var err error
// 先注册函数,再解析模板
tmpl, err = template.New("").Funcs(template.FuncMap{
    "nl2br": nl2br,
}).ParseGlob("views/*")
  1. 模板中调用函数即可:
<div>{{nl2br .Body}}</div>

这种方式不需要手动拼接<br/>标签,原始字符串里的\n会自动转换为可生效的换行标签,安全性更高。

内容的提问来源于stack exchange,提问作者pigfox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:24:00