🥰个人主页:会编程的土豆(欢迎来访)
💎作者简介:后端学习者
❄️个人专栏:数据结构与算法,数据库,leetcode
✨那些你一个人走过的夜路,终将化作照亮未来的光
纯知识点整理:不绑定具体业务故事
标准库:html/template(Web 输出 HTML 用这个)
一、本章在知识体系中的位置
一次 HTTP 处理可以粗分为:
- 处理请求:从
*http.Request读方法、头、参数等 - 业务与数据:查库、计算,得到 Go 中的值(结构体、切片、字符串等)
- 处理响应:把结果返回浏览器
用模板把数据填充进 HTML,生成响应体中的网页内容。
它不是新的服务器,也不是数据库技术,而是响应生成技术。
二、核心概念
2.1 模板(Template)
带有占位与控制指令的 HTML(或文本)文本。
占位与控制写在定界符中,默认是{{与}}。
2.2 数据(data)
执行模板时传入的 Go 值。在模板最外层,用.(点)表示当前数据上下文。
2.3 解析(Parse)
让引擎读取模板文本,识别其中的动作与占位,得到内存中的*template.Template对象。
常见 API:Parse、ParseFiles、ParseGlob,常与Must配合省略错误处理。
2.4 执行(Execute)
把 data 填入已解析模板,将结果写入某个io.Writer。
在 Web 中该 Writer 通常是http.ResponseWriter,因此执行结果成为HTTP 响应体。
2.5 动作(Action)
模板中的控制结构与组合指令(条件、迭代、赋值、包含等),区别于普通静态 HTML 标签。
三、章节结构
| 小节 | 知识目标 |
|---|---|
| 6.1 HelloWorld | 建立最小闭环:有模板 + 能 Execute 出结果 |
| 6.2 解析模板 | 掌握如何从字符串或文件得到*Template |
| 6.3 执行模板 | 掌握Execute,理解「填数据 → 输出」 |
| 6.4 动作 | 掌握模板内逻辑与复用手段 |
记忆顺序:先能解析并执行,再学动作增强模板表达力
四、6.1~6.3:解析与执行(必备基础)
4.1 最小知识模型
模板文本(含 {{ }}) → Parse* → *Template → Execute(w, data) → 输出字节流(常为完整 HTML)4.2 常用加载方式(知识点)
| API | 含义 |
|---|---|
template.New(name) | 创建空的、带名称的模板对象 |
(t).Parse(text) | 解析字符串形式的模板 |
template.ParseFiles(paths...) | 从文件解析;至少一文件 |
template.ParseGlob(pattern) | 按通配符批量解析文件 |
template.Must(t, err) | err 非 nil 则 panic,否则返回 t |
入门最常用组合:
t := template.Must(template.ParseFiles("xxx.html")) err := t.Execute(w, data)4.3 Execute 的含义
t.Execute(w, data)- 用
data驱动模板中的.与动作 - 将生成内容写入
w - Web 场景下即完成「向客户端返回 HTML」
只解析不执行,不会产生对客户端的有效页面输出。
4.4 点.的含义
| 传入 data | 模板中 |
|---|---|
| 基本类型或字符串 | {{.}}表示该值本身 |
| 结构体 | {{.Field}}访问导出字段 |
| 嵌套结构 | {{.A.B}}层层访问 |
字段名须导出(首字母大写)方可在模板中访问。
无参且仅一个返回值的方法,也可在模板中以类似字段的形式调用。
五、6.4 动作总述
动作是模板语言的控制与组合能力,使同一模板可随 data 变化产生不同 HTML。
可分三类理解:
- 流程控制:条件、迭代
- 上下文与变量:设置(赋值 /
with) - 模板组合:包含、定义、块
以下分节说明语法要点、语义与使用注意。
六、6.4.1 条件动作
6.1 语法形式
{{if pipeline}} T {{else}} F {{end}}else可省略。也可使用else if形式(依课程版本练习)。
6.2 真假判断规则(要点)
在 Go 模板中,下列情况视为「假」:
false- 数值 0
- 长度为 0 的字符串、数组、切片、字典
nil指针 / 接口等
其余为「真」。
因此{{if .Stock}}在库存为 0 时走假分支,在库存为正时走真分支。
6.3 语义
根据 pipeline 的真假,选择输出哪一段模板内容。
最终发给浏览器的是已经分支后的静态 HTML,客户端看不到{{if}}源码。
6.4 注意点
- 每个
if必须有对应{{end}} - 条件中引用的字段/方法必须在当前
.上下文中可访问 - 条件动作解决「显不显示、显示哪一段」,不负责循环列表
七、6.4.2 迭代动作
7.1 语法形式
{{range pipeline}} 循环体(此时 . 为当前元素) {{end}}带索引/元素变量:
{{range $index, $element := pipeline}} ... {{end}}7.2 语义
对数组、切片、map、channel 等可迭代对象逐个处理。
进入range后,默认的.切换为当前元素;循环结束后恢复外层上下文(具体以引擎规则为准,嵌套时建议用变量保存外层值)。
7.3 空集合
管道为空时,循环体不执行。
若需「无数据时的提示」,通常外层再包一层条件动作判断集合是否非空。
7.4 知识价值
迭代动作使「一条数据对应一块 HTML 片段」自动化,避免在 Go 中手写字符串拼接循环,是列表类页面的核心模板手段。
八、6.4.3 设置动作
课程中的「设置」通常涵盖两类机制:变量赋值与with。二者都是为了管理模板中的名字与当前上下文。
8.1 变量赋值
{{$x := pipeline}} ... 使用 {{$x}} ...在range中:
{{range $i, $v := .Items}} {{$i}} {{$v}} {{end}}语义:将 pipeline 的结果绑定到模板变量,供后续动作使用。
价值:避免重复写长路径;在.被range/with改变后仍能引用外层数据(若事先存入变量)。
8.2with动作
{{with pipeline}} <!-- 此处 . 变为 pipeline 的值 --> {{else}} <!-- pipeline 为空时 --> {{end}}语义:临时将当前上下文.设置为 pipeline 的值;else在值为空时执行。
价值:缩短{{.A.B.C}}这类深层访问,使一段模板只围绕某一个对象书写。
8.3 与条件/迭代的关系
if:决定分支,不一定改变.range:对集合迭代,并改变.为元素with:不迭代,只切换一次上下文$var:命名保存,不依赖.是否被切换
九、6.4.4 包含动作
9.1 语法形式
{{template "name" pipeline}}将名为name的模板插入当前位置;pipeline作为该模板的数据(常用.表示把当前上下文传入)。
9.2 语义
实现模板之间的嵌套调用,用于页眉、页脚、侧栏等公共片段复用。
9.3 前提条件(重要知识点)
被包含的模板必须已经存在于同一模板集合中(通过同一次或关联的 Parse 加载,或同文件内已define)。
若名称未定义,执行阶段会报错。
9.4 知识价值
分离「布局公共部分」与「页面特有部分」,降低重复,符合大型页面组织方式。
十、6.4.5 定义动作
10.1 语法形式
{{define "name"}} 模板内容 {{end}}10.2 语义
为一段模板内容声明名称,使其可被{{template "name" ...}}引用,或作为执行入口(ExecuteTemplate)。
10.3 与单文件整页模板的对比
| 方式 | 特点 |
|---|---|
| 单文件即一整页 | 简单直观,公共部分易重复 |
define命名片段 | 可复用、可组合,需注意解析范围 |
10.4 加载注意
若定义写在独立文件中,解析页面时需将该文件一并纳入ParseFiles/ParseGlob,否则包含动作找不到定义。
十一、6.4.6 块动作
11.1 语法形式(概念)
{{block "name" pipeline}} 默认内容 {{end}}block可理解为:定义一个名为name的模板,并立刻在当前位置执行它;若别处对同名模板有更具体的define,可形成覆盖/继承式组织(具体写法以课程示例为准)。
11.2 语义与价值
用于布局模板中预留可覆盖区域(如统一骨架中的内容区)。
与define+template同属「模板组合」族,偏重「默认内容 + 可被重写」的模式。
11.3 学习建议
先掌握define与template,再理解block为布局场景下的语法糖/扩展模式,避免一开始混在一起。
十二、动作关系总图(知识结构)
执行 Execute(data) │ ├─ 条件 if/else → 分支输出 ├─ 迭代 range → 集合展开为重复片段 ├─ 设置 $x / with → 命名与切换上下文 ├─ 定义 define → 命名一段模板 ├─ 包含 template → 插入已命名模板 └─ 块 block → 带默认内容的可覆盖区域流程控制解决「内容怎么变」;定义/包含/块解决「模板怎么拆与拼」。
十三、解析、执行、动作的分工(易混点)
| 概念 | 发生位置 | 职责 |
|---|---|---|
| Parse* | Go 代码 | 识别模板与动作语法 |
| Execute | Go 代码 | 求值并输出结果 |
| 动作 | 模板文本{{ }}内 | 规定填数据时的控制与组合 |
动作不是Go 语言的if/for语句;它们是模板语言的语法,仅在模板执行期由模板引擎解释。
十四、与其它响应方式的知识边界
| 方式 | 知识定位 |
|---|---|
| 模板 Execute | 生成(通常完整的)HTML 文档作为响应体 |
w.Write/fmt.Fprint | 直接写字节或短文本(如 Ajax 提示) |
http.FileServer | 返回磁盘上已有静态文件,不做数据填充 |
三者都属「给客户端响应」,机制不同:模板强调数据与视图合并。
十五、知识点检查表
- 能说明模板引擎解决「数据 → HTML 响应」问题
- 能区分解析与执行
- 理解
.表示当前数据上下文 - 掌握条件动作的真假规则与
end - 掌握迭代动作及循环体内
.的变化 - 理解变量赋值与
with对上下文的影响 - 理解
define命名与template包含的前提(同一模板集合) - 知道
block属于布局/可覆盖组合手段 - 能说明动作与 Go 控制流不是同一语言层
十六、本章小结(纯知识浓缩)
- 第 6 章主题:用
html/template将数据渲染为 HTML 响应。 - 基础能力:解析得到模板对象,执行时传入 data 并写入 Writer。
- 动作能力:在模板内进行条件、迭代、变量/上下文设置,以及定义、包含、块式组合。
- 学习顺序:HelloWorld → 解析 → 执行 → 流程类动作 → 组合类动作。
- 本质句:模板是带指令的视图文本;动作是指令;Execute 是一次求值输出。
CSDN 标题建议:《尚硅谷 GoWeb|第6章模板引擎纯知识:解析、执行与六大动作》
标签:GoGoWebhtml/template模板引擎尚硅谷