Go 模板语法详解

发布时间:2026/11/13 12:57:16

Go 模板语法详解 个人主页会编程的土豆欢迎来访作者简介后端学习者❄️个人专栏数据结构与算法数据库leetcode✨那些你一个人走过的夜路终将化作照亮未来的光目标吃透{{ }}里的动作action输出、变量、条件、循环、with、管道与内置函数。这是后面嵌套/继承/Gin 的语法基础。1. 模板语法总览Go 模板里普通文本原样输出逻辑都写在action中{{ ... }}常见类别类别例子作用输出{{.Name}}打印值注释{{/* ... */}}不输出变量{{$x : .}}绑定到$x条件{{if}}...{{end}}分支循环{{range}}...{{end}}遍历改上下文{{with}}...{{end}}临时切换.管道{{. | printf %s}}函数链式处理模板调用{{template x .}}嵌套下节细讲2. 点dot.当前上下文.是模板里最重要的概念Execute(w, data)时根上下文.data进入range/with后.可能变成「当前元素」离开range/with后.恢复例子type Product struct { Name string Price int } type Page struct { ShopName string Items []Product }店铺{{.ShopName}} {{range .Items}} !-- 这里的 . 是 Product -- 商品{{.Name}}价格{{.Price}} {{end}} !-- 这里 . 又回到 Page -- 再次显示店铺{{.ShopName}}如果在range里还想访问外层的ShopName不能写{{.ShopName}}因为.已是 Product要用变量把外层存起来3. 输出与注释3.1 输出字段 / 键 / 方法{{.Name}} !-- struct 导出字段 -- {{.User.Email}} !-- 链式字段 -- {{index .Map k}} !-- map 取值的稳妥写法 -- {{.FullName}} !-- 无参方法方法名需导出 --方法示例type User struct { First string Last string } func (u User) FullName() string { return u.First u.Last }{{.FullName}}注意方法若返回(value, error)模板执行时若 error ! nil 会失败3.2 注释{{/* 这是注释不会出现在最终 HTML 里 */}}注释不能嵌套内容里也不要随便写*/}}这类结束符3.3 什么时候会「空输出」访问不到的字段、nil 指针的字段等在默认设置下可能输出为空或在missingkey等选项下报错。调试时建议先把数据结构打印出来确认字段名大小写一致4. 变量$name用$定义模板变量{{$title : .Title}} h1{{$title}}/h1为什么需要变量最经典场景range 里访问外层数据{{$shop : .ShopName}} {{range .Items}} li{{$shop}} - {{.Name}}/li {{end}}也可以在range时直接接收索引和元素{{range $i, $item : .Items}} li#{{$i}} {{$item.Name}}/li {{end}}赋值与重新绑定{{$x : 1}} {{$x 2}} !-- 重新赋值Go 1.11 模板支持 --入门更常见的是:定义一次后只读使用作用域变量一般在定义它的{{if}}/{{range}}/{{with}}/...{{end}}块内有效在块外可能不可见以你使用的 Go 版本与定义位置为准。实践建议在需要的最小范围内定义。5. 条件if/else/else if{{if .LoggedIn}} p欢迎{{.Name}}/p {{else}} p请先登录/p {{end}}什么算「真」模板把下列值视为false不进入if主体false数字0空字符串nil空的 array / slice / map / chan其它一般视为 true。多分支{{if eq .Role admin}} 管理员面板 {{else if eq .Role editor}} 编辑面板 {{else}} 普通用户 {{end}}比较函数很常用这些是内置函数不是操作符写成函数含义eqne!ltlegtge{{if gt .Age 18}} 成年 {{end}} {{if eq .Status ok ready}} !-- eq 支持多参数与任一相等即为真 -- 可用 {{end}}逻辑与或非{{if and .A .B}} ... {{end}} {{if or .A .B}} ... {{end}} {{if not .Hidden}} ... {{end}}6.with临时切换上下文with有两个作用判断值是否为真若为真在块内把.换成这个值{{with .Profile}} p城市{{.City}}/p p签名{{.Bio}}/p {{else}} p用户未填写资料/p {{end}}等价心智模型如果 Profile 有值 进入块且 . Profile 否则 走 elsewith 变量{{with $p : .Profile}} {{$p.City}} {{end}}ifvswithifwith是否切换.否是适合纯条件判断深入嵌套结构体字段很多人写{{if .Profile}}{{.Profile.City}}{{end}}用with更干净。7.range遍历可遍历slice、array、map、channel。7.1 基础遍历ul {{range .Items}} li{{.Name}} - ¥{{.Price}}/li {{else}} li暂无商品/li {{end}} /ulelse分支在集合为空时执行非常适合空状态 UI。7.2 索引与元素{{range $index, $product : .Items}} tr td{{$index}}/td td{{$product.Name}}/td /tr {{end}}遍历 map{{range $key, $value : .Labels}} span{{$key}}{{$value}}/span {{end}}注意map 的遍历顺序不稳定随机若要稳定展示应在 Go 里先排好序再传给模板或传[]struct{Key, Value}。7.3 range 里修改了.{{range .Items}} !-- . 是元素 -- {{.Name}} {{end}}若只写{{range .Items}}不接变量元素就绑定到.。8. 管道pipeline管道用|把左边结果作为右边函数的最后一个参数。{{.Name | printf 用户%s}}等价于printf(用户%s, .Name)。多级管道{{.Name | printf %s | html}}在html/template中上下文感知转义通常已自动发生这里主要演示管道形态。常见内置函数函数作用例子printf格式化{{printf %.2f .Price}}len长度{{len .Items}}index下标/键访问{{index .Items 0}}slice切片新版本支持{{slice .Items 0 3}}and/or/not逻辑见上urlquery查询参数转义{{.Q | urlquery}}js/html等按上下文转义较少手写index详解{{index .Scores 0}} !-- slice[0] -- {{index .UserMap u100}} !-- map[u100] -- {{index .Matrix 1 2}} !-- 多维先 [1] 再 [2] --当字段名是动态字符串、或键不是合法标识符时index很有用。printf详解{{printf %s-%d .Name .Age}} {{.Price | printf %d}}9. 综合示例商品列表页main.go数据package main import ( html/template os ) type Product struct { Name string Price int Tags []string } type Page struct { Title string ShopName string VIP bool Items []Product } func main() { tmpl : template.Must(template.New(list).Parse(listHTML)) data : Page{ Title: 今日特价, ShopName: 七米小店, VIP: true, Items: []Product{ {Name: Go 书, Price: 88, Tags: []string{编程, 热销}}, {Name: 键盘, Price: 299, Tags: []string{外设}}, }, } tmpl.Execute(os.Stdout, data) } const listHTML !DOCTYPE html html headmeta charsetutf-8title{{.Title}}/title/head body h1{{.Title}}/h1 p店铺{{.ShopName}}/p {{if .VIP}} pVIP 专属折扣已开启/p {{else}} p开通 VIP 更优惠/p {{end}} p共 {{len .Items}} 件商品/p {{$shop : .ShopName}} ul {{range $i, $p : .Items}} li #{{$i}} [{{$shop}}] strong{{$p.Name}}/strong {{printf %d $p.Price}} {{with $p.Tags}} 标签 {{range .}} span{{.}}/span {{end}} {{end}} /li {{else}} li暂无商品/li {{end}} /ul {{with index .Items 0}} p推荐{{.Name}}/p {{end}} /body /html 这个例子一口气用到了输出、if、len$shop保留外层range带索引with处理标签printf管道式格式化index取第一件商品建议你改数据把Items置空、把VIP改false观察分支变化。10. 空值与安全输出意识指针字段type User struct { Name *string }若Name nil{{.Name}}可能出问题或为空。更稳妥是在 Go 侧先规范化数据或模板里{{with .Name}}{{.}}{{else}}匿名{{end}}HTML 转义html/template会按插入点上下文转义。用户可控内容不要随便用template.HTML关闭转义lesson08 会讲。缺失键对 map可设置tmpl.Option(missingkeyerror)让访问不存在的 key 直接报错便于调试
延伸阅读

更多相关文章

2026/11/11 20:42:54

Grove TDS传感器原理、校准与物联网应用实战指南

1. 项目缘起:从“水质”到“可测”的最后一公里 做水质监测项目,无论是家庭净水器滤芯寿命提醒、鱼缸水质管理,还是小型农业灌溉、水培营养液监控,TDS(总溶解固体)都是一个绕不开的核心指标。它虽然不能告诉…

2026/11/10 2:01:58

抖音爆款内容自动分发机器人是如何炼成的?——扣子平台API深度调用与合规风控全拆解(2024最新版)

更多请点击: https://codechina.net 第一章:抖音爆款内容自动分发机器人的核心价值与合规边界 抖音爆款内容自动分发机器人并非简单的内容搬运工具,而是融合算法理解、平台规则适配与用户行为建模的智能协同系统。其核心价值体现在三重维度&…

2026/11/13 12:54:25

电工作业视频配音上岗必须要这个证吗 值不值得考

电工作业视频配音上岗必须要这个证吗 值不值得考 不知道去哪报名怕被中介坑,这几乎是每个想考电工作业操作证的人的第一反应。尤其在商丘劳务班组里,很多电工师傅都经历过被各种“培训中心”忽悠、交了钱还拿不到证的情况。电工作业视频配音虽然听起来和传…

2026/11/13 12:54:25

三门峡工地电工证到期换证太麻烦?城乡管理局电工证多少钱能搞定?

三门峡工地电工证到期换证太麻烦?城乡管理局电工证多少钱能搞定? 工地太忙根本没时间复习考试,城乡管理局电工证到期换证流程又复杂,每次看到通知就头疼。尤其是像我这样在三门峡项目上管现场的,手头一堆活要干,哪还有空去折腾证书的事。但你知道吗?城…

2026/11/13 12:54:25

之前考的证在外省能不能转过来 电工证多长时间拿到证上岗必备全解析

之前考的证在外省能不能转过来 电工证多长时间拿到证上岗必备全解析 之前考的证在外省能不能转过来?这是很多从事电工工作的朋友最关心的问题。尤其是像我们郑州金水区劳务班组负责人,手里握着几十个施工项目,电工证是否能顺利转过来,直接关系到项目能否…

2026/11/13 12:54:25

上海市电工证复审多少钱?怕考不过白交培训费看过来

上海市电工证复审多少钱?怕考不过白交培训费看过来 你是不是也担心上海市电工证复审要花大钱,结果还考不过?其实,这事儿没你想得那么复杂,只要准备到位,费用合理,通过率也很高。今天我们就来聊聊上海市电工证复审到底要多少钱、怎么准备、有哪些避坑经…

2026/11/13 12:49:25

办理武侯区电工证考证需要什么材料

外省电工证能转武侯区吗?怎么报名全流程详解 之前考的证在外省能不能转过来?这是很多在武侯区从事电工工作的朋友最关心的问题。特别是在驻马店从事房建工程的电工朋友,经常面临证书跨省使用、复审和换证的难题。今天就从政策背景出发,详细讲讲武侯区电工…

2026/11/12 20:35:13

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/13 0:01:06

办上海高压电工证良心建议:别被中介坑了,自己看这篇就够了

办上海高压电工证良心建议:别被中介坑了,自己看这篇就够了 你是不是也像我一样,第一次听说“高压电工证”这个名词,就感觉一头雾水?其实很多人都跟我一样,不知道去哪报名、怕被中介坑,结果花了冤枉钱还考不上。今天我就从一个在商丘培训过的学员角度,…

2026/11/13 0:01:06

黎里考电工证在哪里值不值得考

黎里考电工证在哪里值不值得考 之前考的证在外省能不能转过来?这是很多在外地工作、准备回老家发展的朋友最关心的问题。特别是在黎里地区,很多从事电力相关工作的朋友,都面临这样一个难题: 外省的电工证能否在本地使用?值不值得考?…

2026/11/13 0:01:06

毕节哪里考电工证 怎么报名学历不高也能上手

毕节哪里考电工证 怎么报名学历不高也能上手 你是不是也和我一样,学历不高,想着考个电工证,但又担心自己条件不够,怕报不上名?其实不然,只要符合条件,学历不高也能考电工证。今天就来聊聊【毕节哪里考电工证】这个问题,还有怎么报名,让你一步到位不…

2026/11/12 22:10:13

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑