it编程 > 前端脚本 > Golang

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

5人参与 2025-04-24 Golang

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

1. 基础模板解析与渲染

template.parse 和 template.execute

解析模板字符串并渲染数据。

package main

import (
    "html/template"
    "os"
)

func main() {
    // 定义模板字符串
    tmplstr := `<h1>{{.title}}</h1><p>{{.content}}</p>`

    // 解析模板
    tmpl, err := template.new("page").parse(tmplstr)
    if err != nil {
        panic(err)
    }

    // 定义数据
    data := struct {
        title   string
        content string
    }{
        title:   "欢迎页面",
        content: "这是安全渲染的内容!",
    }

    // 渲染并输出到标准输出
    err = tmpl.execute(os.stdout, data)
    if err != nil {
        panic(err)
    }
}

输出结果

<h1>欢迎页面</h1><p>这是安全渲染的内容!</p>

2. 从文件加载模板

template.parsefiles

从多个文件加载模板,支持模板继承和嵌套。

// 文件: templates/header.html
{{ define "header" }}<header>{{.sitename}}</header>{{ end }}

// 文件: templates/page.html
{{ define "page" }}
<!doctype html>
<html>
  {{ template "header" . }}
  <body>
    <h1>{{.title}}</h1>
  </body>
</html>
{{ end }}
func main() {
    // 解析多个模板文件
    tmpl, err := template.parsefiles(
        "templates/header.html",
        "templates/page.html",
    )
    if err != nil {
        panic(err)
    }

    // 渲染数据
    data := struct {
        sitename string
        title    string
    }{
        sitename: "我的网站",
        title:    "主页",
    }

    // 指定使用 "page" 模板渲染
    err = tmpl.executetemplate(os.stdout, "page", data)
}

输出结果

<!doctype html>
<html>
  <header>我的网站</header>
  <body>
    <h1>主页</h1>
  </body>
</html>

3. 自动转义与安全内容

自动转义 xss 内容

默认情况下,所有变量内容会被转义。

data := struct {
    userinput string
}{
    userinput: "<script>alert('xss')</script>",
}

tmplstr := `<div>{{.userinput}}</div>`
tmpl, _ := template.new("test").parse(tmplstr)
tmpl.execute(os.stdout, data)

输出结果

<div>&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;</div>

信任原始 html

使用 template.html 类型标记安全内容。

data := struct {
    safecontent template.html
}{
    safecontent: template.html("<b>加粗文本</b>"),
}

tmplstr := `<div>{{.safecontent}}</div>`
tmpl, _ := template.new("test").parse(tmplstr)
tmpl.execute(os.stdout, data)

输出结果

<div><b>加粗文本</b></div>

4. 自定义模板函数

funcs 与 template.funcmap

注册自定义函数到模板中。

func main() {
    // 定义自定义函数
    funcmap := template.funcmap{
        "safehtml": func(s string) template.html {
            return template.html(s)
        },
    }

    // 创建模板并注册函数
    tmplstr := `<div>{{. | safehtml}}</div>`
    tmpl := template.new("test").funcs(funcmap)
    tmpl, _ = tmpl.parse(tmplstr)

    // 渲染数据
    tmpl.execute(os.stdout, "<em>斜体文本</em>")
}

输出结果

<div><em>斜体文本</em></div>

5. 条件判断与循环

if 和 range 语法

在模板中实现逻辑控制。

data := struct {
    showheader bool
    items      []string
}{
    showheader: true,
    items:      []string{"go", "python", "java"},
}

tmplstr := `
{{ if .showheader }}<h1>列表</h1>{{ end }}
<ul>
{{ range .items }}
  <li>{{ . }}</li>
{{ end }}
</ul>
`

tmpl, _ := template.new("list").parse(tmplstr)
tmpl.execute(os.stdout, data)

输出结果

<h1>列表</h1>
<ul>
  <li>go</li>
  <li>python</li>
  <li>java</li>
</ul>

6. 嵌套模板与块定义

define 和 template 指令

复用模板片段。

// 定义基础模板
tmplstr := `
{{ define "layout" }}
<!doctype html>
<html>
  <head>{{ template "title" }}</head>
  <body>{{ template "content" . }}</body>
</html>
{{ end }}

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

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

// 覆盖部分块
customtmplstr := `
{{ define "content" }}<h1>{{.message}}</h1>{{ end }}
`

// 解析模板
tmpl, _ := template.new("base").parse(tmplstr)
tmpl, _ = tmpl.parse(customtmplstr)

// 渲染数据
data := struct{ message string }{message: "自定义内容"}
tmpl.executetemplate(os.stdout, "layout", data)

输出结果

<!doctype html>
<html>
  <head><title>默认标题</title></head>
  <body><h1>自定义内容</h1></body>
</html>

总结

到此这篇关于go语言中html/template模块详细功能介绍与示例代码的文章就介绍到这了,更多相关go语言html/template模块内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Go语言标准库中math模块详细功能介绍与示例代码

04-24

Go语言fmt模块的完整方法详解及示例代码

04-24

gin+gorm实现goweb项目的示例代码

04-24

Go语言中sync包使用方法教程

04-24

golang使用RSA加密和解密的实现示例

04-24

GoLand 中设置默认项目文件夹的实现

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论