goweb模板语法html/template

 更新时间:2026年02月25日 10:35:07   作者:郭京京  
​在Go语言里, html/template 包主要用于安全地生成HTML输出,它能够有效防止跨站脚本攻击(XSS),借助模板语法将数据动态填充到HTML文件中,下面就来详细的介绍一下

​在Go语言里, html/template 包主要用于安全地生成HTML输出。它能够有效防止跨站脚本攻击(XSS),借助模板语法将数据动态填充到HTML文件中。

模板的定义与解析

借助template.New和template.ParseFiles或者template.ParseGlob方法,能够定义并解析模板文件。

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    // 创建一个新的模板
    tmpl := template.New("example")

    // 解析模板文件
    tmpl, err := tmpl.ParseFiles("example.tmpl")
    if err != nil {
        log.Fatal(err)
    }

    // 定义数据
    data := struct {
        Name string
    }{
        Name: "John Doe",
    }

    // 执行模板并将结果输出到标准输出
    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        log.Fatal(err)
    }
}

模板文件示例(example.tmpl)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Example Template</title>
</head>
<body>
    <h1>Hello, {{.Name}}!</h1>
</body>
</html>

条件语句

在模板里能够使用条件语句来依据数据展示不同内容。

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    tmpl, err := template.ParseFiles("conditional.tmpl")
    if err != nil {
        log.Fatal(err)
    }

    data := struct {
        IsAdmin bool
    }{
        IsAdmin: true,
    }

    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        log.Fatal(err)
    }
}

条件模板文件示例(conditional.tmpl)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Conditional Template</title>
</head>
<body>
    {{if .IsAdmin}}
        <p>You are an admin!</p>
    {{else}}
        <p>You are a regular user.</p>
    {{end}}
</body>
</html>

循环语句

在模板中可使用循环语句来遍历切片或者映射。

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    tmpl, err := template.ParseFiles("loop.tmpl")
    if err != nil {
        log.Fatal(err)
    }

    data := []string{"Apple", "Banana", "Cherry"}

    err = tmpl.Execute(os.Stdout, data)
    if err != nil {
        log.Fatal(err)
    }
}

循环模板文件示例(loop.tmpl)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Loop Template</title>
</head>
<body>
    <ul>
        {{range .}}
            <li>{{.}}</li>
        {{end}}
    </ul>
</body>
</html>

嵌套模板

可以在一个模板里包含另一个模板。

可以使用 {{template "templateName" .}} 来调用并执行定义好的模板块。其中,. 表示传递给模板块的数据。

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    tmpl, err := template.ParseFiles("base.tmpl", "header.tmpl")
    if err != nil {
        log.Fatal(err)
    }

    data := struct {
        Title string
    }{
        Title: "Nested Template Example",
    }

    err = tmpl.ExecuteTemplate(os.Stdout, "base.tmpl", data)
    if err != nil {
        log.Fatal(err)
    }
}

基础模板文件示例(base.tmpl)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.Title}}</title>
</head>
<body>
    {{template "header.tmpl" .}}
    <p>Main content goes here.</p>
</body>
</html>

头部模板文件示例(header.tmpl)

<header>
    <h1>{{.Title}}</h1>
</header>

define指令的作用

define 指令用于在模板文件中定义一个命名的模板块。这个模板块可以在同一个模板文件或者其他模板文件中被调用和执行。通过使用 define 指令,你可以将重复的 HTML 代码片段封装成可复用的模块,提高代码的可维护性和复用性。

基本语法

在模板文件中,使用 {{define "templateName"}} 来开始定义一个模板块,使用 {{end}} 来结束定义。其中,templateName 是你为这个模板块指定的名称。

{{define "templateName"}}
    <!-- 这里是模板块的内容 -->
{{end}}

单个模板文件中使用define

以下是一个示例,展示了如何在单个模板文件中定义和使用模板块。

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    tmpl, err := template.ParseFiles("single_template.tmpl")
    if err != nil {
        log.Fatal(err)
    }

    data := struct {
        Title string
    }{
        Title: "Single Template Example",
    }

    err = tmpl.ExecuteTemplate(os.Stdout, "main", data)
    if err != nil {
        log.Fatal(err)
    }
}

single_template.tmpl

{{define "header"}}
    <header>
        <h1>{{.Title}}</h1>
    </header>
{{end}}

{{define "main"}}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{.Title}}</title>
    </head>
    <body>
        {{template "header" .}}
        <p>Main content goes here.</p>
    </body>
    </html>
{{end}}

在这个示例中,我们在 single_template.tmpl 文件中定义了两个模板块:header 和 main。在 main 模板块中,我们使用 {{template "header" .}} 调用了 header 模板块。

多个模板文件中使用define

以下是一个示例,展示了如何在多个模板文件中定义和使用模板块。

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    tmpl, err := template.ParseFiles("base.tmpl", "header.tmpl")
    if err != nil {
        log.Fatal(err)
    }

    data := struct {
        Title string
    }{
        Title: "Multiple Templates Example",
    }

    err = tmpl.ExecuteTemplate(os.Stdout, "base", data)
    if err != nil {
        log.Fatal(err)
    }
}

header.tmpl

{{define "header"}}
    <header>
        <h1>{{.Title}}</h1>
    </header>
{{end}}

base.tmpl

{{define "base"}}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{.Title}}</title>
    </head>
    <body>
        {{template "header" .}}
        <p>Main content goes here.</p>
    </body>
    </html>
{{end}}

在这个示例中,我们将 header 模板块定义在 header.tmpl 文件中,将 base 模板块定义在 base.tmpl 文件中。在 base 模板块中,我们使用 {{template "header" .}} 调用了 header 模板块。

注意事项

  • 当使用 ParseFiles 或 ParseGlob 解析多个模板文件时,所有定义的模板块都会被加载到同一个模板集合中,因此可以在不同的模板文件中相互调用。
  • 传递给 template 指令的数据可以是任意类型,只要在模板块中能够正确处理即可。

到此这篇关于goweb模板语法html/template的文章就介绍到这了,更多相关go html/template内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang的database.sql包和事务处理操作步骤

    golang的database.sql包和事务处理操作步骤

    事务是数据库操作中的一个逻辑单元,由一系列的数据库操作组成,这一系列操作要么全部执行并且提交,要么全部回滚,确保数据的一致性和完整性,这篇文章主要介绍了golang的database.sql包和事务处理操作步骤,需要的朋友可以参考下
    2025-04-04
  • 浅析Golang中变量与常量的声明与使用

    浅析Golang中变量与常量的声明与使用

    变量、常量的声明与使用是掌握一门编程语言的基础,这篇文章主要为大家详细介绍了Golang中变量与常量的声明与使用,需要的可以参考一下
    2023-04-04
  • 教你一分钟配置好Go语言开发环境(多种操作系统)

    教你一分钟配置好Go语言开发环境(多种操作系统)

    在这篇文章中,我们从头到尾一步步指导你配置Golang开发环境,并编写你的第一个"Hello, World!"程序,我们详细解释了在多种操作系统(包括Windows、Linux和macOS)下的安装过程、环境变量设置以及如何验证安装是否成功
    2023-09-09
  • golang判断chan channel是否关闭的方法

    golang判断chan channel是否关闭的方法

    这篇文章主要介绍了golang判断chan channel是否关闭的方法,结合实例形式对比分析了Go语言判断chan没有关闭的后果及关闭的方法,需要的朋友可以参考下
    2016-07-07
  • Go语言异常处理(Panic和recovering)用法详解

    Go语言异常处理(Panic和recovering)用法详解

    异常处理是程序健壮性的关键,往往开发人员的开发经验的多少从异常部分处理上就能得到体现。Go语言中没有Try Catch Exception机制,但是提供了panic-and-recover机制,本文就来详细讲讲他们的用法
    2022-07-07
  • golang gin ShouldBind的介绍和使用示例详解

    golang gin ShouldBind的介绍和使用示例详解

    在 Go 语言的 Gin 框架中,ShouldBind 是用于将请求中的数据绑定到结构体的一个方法,它简化了从请求中提取参数的过程,支持多种数据格式,下面给大家分享golang gin ShouldBind的介绍和使用示例,感兴趣的朋友一起看看吧
    2024-10-10
  • Go语言中Elasticsearch全文搜索与日志分析的实战

    Go语言中Elasticsearch全文搜索与日志分析的实战

    Elasticsearch在Go语言中的应用非常广泛,本文就来介绍一下Go语言中Elasticsearch全文搜索与日志分析的实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • 使用go mod导入本地自定义包问题

    使用go mod导入本地自定义包问题

    这篇文章主要介绍了使用go mod导入本地自定义包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • golang构建HTTP服务的实现步骤

    golang构建HTTP服务的实现步骤

    其实很多框架都是在 最简单的http服务上做扩展的的,基本上都是遵循http协议,本文主要介绍了golang构建HTTP服务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Golang语言中切片的长度和容量的概念和使用

    Golang语言中切片的长度和容量的概念和使用

    这篇文章主要介绍了Golang语言中切片的长度和容量的概念和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11

最新评论