• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Go语言中html/template模块详细功能介绍与示例代码

    发布者: 琛瑞6678 | 发布时间: 2025-8-14 11:56| 查看数: 80| 评论数: 0|帖子模式

    Go语言的
    1. html/template
    复制代码
    模块是专门用于生成安全 HTML 输出的模板引擎,支持自动转义以防止 XSS 攻击。以下是该模块的核心方法及用法示例:

    1. 基础模板解析与渲染


    template.Parse 和 template.Execute

    解析模板字符串并渲染数据。
    1. package main

    2. import (
    3.     "html/template"
    4.     "os"
    5. )

    6. func main() {
    7.     // 定义模板字符串
    8.     tmplStr := `<h1>{{.Title}}</h1><p>{{.Content}}</p>`

    9.     // 解析模板
    10.     tmpl, err := template.New("page").Parse(tmplStr)
    11.     if err != nil {
    12.         panic(err)
    13.     }

    14.     // 定义数据
    15.     data := struct {
    16.         Title   string
    17.         Content string
    18.     }{
    19.         Title:   "欢迎页面",
    20.         Content: "这是安全渲染的内容!",
    21.     }

    22.     // 渲染并输出到标准输出
    23.     err = tmpl.Execute(os.Stdout, data)
    24.     if err != nil {
    25.         panic(err)
    26.     }
    27. }
    复制代码
    输出结果
    1. <h1>欢迎页面</h1><p>这是安全渲染的内容!</p>
    复制代码
    2. 从文件加载模板


    template.ParseFiles

    从多个文件加载模板,支持模板继承和嵌套。
    1. // 文件: templates/header.html
    2. {{ define "header" }}<header>{{.SiteName}}</header>{{ end }}

    3. // 文件: templates/page.html
    4. {{ define "page" }}
    5. <!DOCTYPE html>
    6. <html>
    7.   {{ template "header" . }}
    8.   <body>
    9.     <h1>{{.Title}}</h1>
    10.   </body>
    11. </html>
    12. {{ end }}
    复制代码
    1. func main() {
    2.     // 解析多个模板文件
    3.     tmpl, err := template.ParseFiles(
    4.         "templates/header.html",
    5.         "templates/page.html",
    6.     )
    7.     if err != nil {
    8.         panic(err)
    9.     }

    10.     // 渲染数据
    11.     data := struct {
    12.         SiteName string
    13.         Title    string
    14.     }{
    15.         SiteName: "我的网站",
    16.         Title:    "主页",
    17.     }

    18.     // 指定使用 "page" 模板渲染
    19.     err = tmpl.ExecuteTemplate(os.Stdout, "page", data)
    20. }
    复制代码
    输出结果
    1. <!DOCTYPE html>
    2. <html>
    3.   <header>我的网站</header>
    4.   <body>
    5.     <h1>主页</h1>
    6.   </body>
    7. </html>
    复制代码
    3. 自动转义与安全内容


    自动转义 XSS 内容

    默认情况下,所有变量内容会被转义。
    1. data := struct {
    2.     UserInput string
    3. }{
    4.     UserInput: "<script>alert('xss')</script>",
    5. }

    6. tmplStr := `<div>{{.UserInput}}</div>`
    7. tmpl, _ := template.New("test").Parse(tmplStr)
    8. tmpl.Execute(os.Stdout, data)
    复制代码
    输出结果
    1. <div>&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;</div>
    复制代码
    信任原始 HTML

    使用
    1. template.HTML
    复制代码
    类型标记安全内容。
    1. data := struct {
    2.     SafeContent template.HTML
    3. }{
    4.     SafeContent: template.HTML("<b>加粗文本</b>"),
    5. }

    6. tmplStr := `<div>{{.SafeContent}}</div>`
    7. tmpl, _ := template.New("test").Parse(tmplStr)
    8. tmpl.Execute(os.Stdout, data)
    复制代码
    输出结果
    1. <div><b>加粗文本</b></div>
    复制代码
    4. 自定义模板函数


    Funcs 与 template.FuncMap

    注册自定义函数到模板中。
    1. func main() {
    2.     // 定义自定义函数
    3.     funcMap := template.FuncMap{
    4.         "safeHTML": func(s string) template.HTML {
    5.             return template.HTML(s)
    6.         },
    7.     }

    8.     // 创建模板并注册函数
    9.     tmplStr := `<div>{{. | safeHTML}}</div>`
    10.     tmpl := template.New("test").Funcs(funcMap)
    11.     tmpl, _ = tmpl.Parse(tmplStr)

    12.     // 渲染数据
    13.     tmpl.Execute(os.Stdout, "<em>斜体文本</em>")
    14. }
    复制代码
    输出结果
    1. <div><em>斜体文本</em></div>
    复制代码
    5. 条件判断与循环


    if 和 range 语法

    在模板中实现逻辑控制。
    1. data := struct {
    2.     ShowHeader bool
    3.     Items      []string
    4. }{
    5.     ShowHeader: true,
    6.     Items:      []string{"Go", "Python", "Java"},
    7. }

    8. tmplStr := `
    9. {{ if .ShowHeader }}<h1>列表</h1>{{ end }}
    10. <ul>
    11. {{ range .Items }}
    12.   <li>{{ . }}</li>
    13. {{ end }}
    14. </ul>
    15. `

    16. tmpl, _ := template.New("list").Parse(tmplStr)
    17. tmpl.Execute(os.Stdout, data)
    复制代码
    输出结果
    1. <h1>列表</h1>
    2. <ul>
    3.   <li>Go</li>
    4.   <li>Python</li>
    5.   <li>Java</li>
    6. </ul>
    复制代码
    6. 嵌套模板与块定义


    define 和 template 指令

    复用模板片段。
    1. // 定义基础模板
    2. tmplStr := `
    3. {{ define "layout" }}
    4. <!DOCTYPE html>
    5. <html>
    6.   <head>{{ template "title" }}</head>
    7.   <body>{{ template "content" . }}</body>
    8. </html>
    9. {{ end }}

    10. {{ define "title" }}<title>默认标题</title>{{ end }}

    11. {{ define "content" }}<p>默认内容</p>{{ end }}
    12. `

    13. // 覆盖部分块
    14. customTmplStr := `
    15. {{ define "content" }}<h1>{{.Message}}</h1>{{ end }}
    16. `

    17. // 解析模板
    18. tmpl, _ := template.New("base").Parse(tmplStr)
    19. tmpl, _ = tmpl.Parse(customTmplStr)

    20. // 渲染数据
    21. data := struct{ Message string }{Message: "自定义内容"}
    22. tmpl.ExecuteTemplate(os.Stdout, "layout", data)
    复制代码
    输出结果
    1. <!DOCTYPE html>
    2. <html>
    3.   <head><title>默认标题</title></head>
    4.   <body><h1>自定义内容</h1></body>
    5. </html>
    复制代码
    总结


    • 安全性:自动转义 HTML 特殊字符,防止 XSS 攻击。
    • 核心方法
      1. Parse
      复制代码
      ,
      1. ParseFiles
      复制代码
      ,
      1. Execute
      复制代码
      ,
      1. Funcs
      复制代码

    • 高级功能

      • 嵌套模板(
        1. define
        复制代码
        1. template
        复制代码
        )。
      • 条件与循环(
        1. if
        复制代码
        1. range
        复制代码
        )。
      • 自定义函数(
        1. Funcs
        复制代码
        )。

    • 适用场景:动态生成安全 HTML 页面,如 Web 应用的后端渲染。
    到此这篇关于Go语言中html/template模块详细功能介绍与示例代码的文章就介绍到这了,更多相关Go语言html/template模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表