
在Go HTML模板中,使用{{range}}语法遍历切片时,可通过$index, $value := .Slice形式同时获取当前元素索引和值,索引从0开始,无需额外函数或上下文变量。
在go html模板中,使用`{{range}}`语法遍历切片时,可通过`$index, $value := .slice`形式同时获取当前元素索引和值,索引从0开始,无需额外函数或上下文变量。
Go 的 html/template 包原生支持带索引的 range 遍历,其语法与 Go 语言中的 for i, v := range slice 高度一致。只需在 {{range}} 后声明两个变量:第一个为索引(通常命名为 $index),第二个为当前项(如 $article),并用 := 绑定数据源即可。
✅ 正确写法示例:
{{ range $index, $article := $.Articles }}
<div class="article-item" data-index="{{ $index }}">
<span class="index-badge">#{{ add1 $index }}</span>
<h3>{{ $article.Title }}</h3>
<time>{{ $article.CreatedOn | formatTime }}</time>
</div>
{{ end }}⚠️ 注意事项:
- 索引变量名必须以 $ 开头(如 $index),否则会被视为普通标识符而非变量声明;
- 若只声明一个变量(如 {{range $article := .Articles}}),则该变量代表元素值,索引不可访问;
- $index 是整数类型(int),可直接用于比较、条件判断(如 {{if eq $index 0}})或传入自定义函数;
- 若需从1开始编号,可借助内置函数(需提前定义)或使用 add1(需注册 funcMap 中的 add1 函数:"add1": func(i int) int { return i + 1 });
- 范围内若需访问外层作用域的 ., 应显式使用 $.FieldName(如 $.PageTitle),避免因作用域切换导致数据丢失。
? 小技巧:你还可以嵌套使用带索引的 range,例如遍历二维切片或 map 的键值对——{{range $i, $row := .Grid}}{{range $j, $cell := $row}}...{{end}}{{end}},实现灵活的表格/网格渲染。
掌握这一模式,即可在模板中高效实现序号列表、首项高亮、奇偶行样式、分页导航等常见需求,无需后端预处理索引字段。

















