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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 代码生成工具详解

    Go 代码生成工具详解

    这篇文章主要介绍了Go 代码生成工具详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • golang中使用aes加密的操作方法

    golang中使用aes加密的操作方法

    AES是一种对称加密算法,适用于加密敏感数据,通过上述方法,可在 Golang中实现AES加密/解密功能,本文给大家介绍golang中使用aes加密的操作方法,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Go语言时间处理必备技巧全解析

    Go语言时间处理必备技巧全解析

    Golang 的时间处理是 Golang 编程中的一个重要方面,它涉及到了时间类型、时间格式化、时间计算、时区处理以及定时器和超时机制等多个方面。在本文中,我们将从更深入的角度来探讨 Golang 的时间处理
    2023-04-04
  • Go语言深度拷贝工具deepcopy的使用教程

    Go语言深度拷贝工具deepcopy的使用教程

    今天给大家推荐的工具是deepcopy,一个可以对指针、接口、切片、结构体、Map都能进行深拷贝的工具,感兴趣的小伙伴快跟随小编一起学习学习
    2022-09-09
  • Centos下搭建golang环境及vim高亮Go关键字设置的方法

    Centos下搭建golang环境及vim高亮Go关键字设置的方法

    这篇文章先给大家详细介绍了在Centos下搭建golang环境的步骤,大家按照下面的方法就可以自己搭建golang环境,搭建完成后又给大家介绍了vim高亮Go关键字设置的方法,文中通过示例代码介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11
  • golang的HTTP基本认证机制实例详解

    golang的HTTP基本认证机制实例详解

    这篇文章主要介绍了golang的HTTP基本认证机制,结合实例形式较为详细的分析了HTTP请求响应的过程及认证机制实现技巧,需要的朋友可以参考下
    2016-07-07
  • Go语言原子操作atomic的使用

    Go语言原子操作atomic的使用

    本文介绍了Go语言原子操作的使用方法,原子操作是一种无锁的技术,可通过CPU指令实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • golang遍历处理map时的常见性能陷阱与解决方法

    golang遍历处理map时的常见性能陷阱与解决方法

    这篇文章主要为大家详细介绍了Golang中有关循环处理map时的性能优化,本文主要介绍了常见的三种场景,文中的示例代码讲解详细,需要的可以了解下
    2025-05-05
  • 详解Go多协程并发环境下的错误处理

    详解Go多协程并发环境下的错误处理

    这篇文章主要介绍了详解Go多协程并发环境下的错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • go日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论