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

Go语言中如何让HTML模板识别字符串为HTML——官方Wiki应用扩展问题

解决Go模板渲染HTML内容为纯文本的问题

你遇到的是Go模板默认HTML转义的问题——你的<li>标签被自动转义成了纯文本,所以没有渲染成预期的列表元素。这是Go的html/template包为防止XSS攻击做的安全设计,我们只需要告诉模板哪些内容是安全的HTML即可。

具体解决方案如下:

  1. 修改Page结构体的Body字段类型
    把原来的[]byte或string类型改成html/template.HTML类型,这个类型会明确告诉模板:“这段内容是安全的HTML,可以直接渲染”。

    import "html/template"
    
    type Page struct {
        Title string
        Body  template.HTML // 替换原有的[]byte/string类型
    }
    
  2. 调整处理器代码,标记HTML内容为安全
    在frontHandler里,将getEntries()返回的拼接好的HTML字符串转换成template.HTML类型,替代原来的字节切片转换:

    func frontHandler(w http.ResponseWriter, r *http.Request){
        entries := getEntries() // 假设该函数返回完整的<li>标签拼接字符串
        // 将字符串转换为template.HTML,标记为安全可渲染的HTML内容
        p := &Page{Title: "FrontPage", Body: template.HTML(entries)}
        renderTemplate(w, "front", p)
    }
    
  3. 简化模板中的输出写法
    不需要再用printf "%s",直接输出.Body即可,template.HTML类型会被模板正确解析为HTML元素:

    <h1>This is the front page of the wiki</h1>
    <p>here is the list of entries:</p>
    <div>
      <ul>
        {{.Body}}
      </ul>
    </div>
    

为什么之前的尝试没用?

Go的html/template默认会对所有字符串、字节切片类型的内容进行HTML转义,把<转成&lt;、>转成&gt;,所以你的列表标签变成了纯文本。而template.HTML是一个特殊的包装类型,它实现了专属接口,能让模板跳过转义步骤,直接渲染原始HTML。

注意事项

确保getEntries()生成的HTML内容是安全的——如果条目名称来自用户输入,一定要先做XSS防护(比如过滤特殊字符),因为使用template.HTML会绕过转义,恶意内容可能会被执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:12:44