
在Go HTML模板中,可通过{{range $index, $value := $slice}}语法同时获取元素索引与值,其中索引从0开始,支持直接在模板内使用(如显示序号、条件渲染等),无需额外辅助函数。
在go html模板中,可通过`{{range $index, $value := $slice}}`语法同时获取元素索引与值,其中索引从0开始,支持直接在模板内使用(如显示序号、条件渲染等),无需额外辅助函数。
Go的HTML模板系统虽不支持原生for i, v := range语法,但提供了功能等效且语义清晰的变量绑定机制:在{{range}}动作中,允许显式声明两个点号变量——第一个为索引(通常命名为$index),第二个为当前元素(如$article)。该索引自动按遍历顺序递增,起始值为0,与Go语言中的切片遍历行为完全一致。
以下是一个典型用例,展示如何在文章列表中渲染带序号的条目:
{{ range $index, $article := $.Articles }}
<div class="article-item">
<span class="item-index">#{{ add $index 1 }}</span> <!-- 显示从1开始的序号 -->
<h3>{{ $article.Title }}</h3>
<p>{{ $article.Summary }}</p>
<time>{{ $article.CreatedAt | formatTime }}</time>
</div>
{{ end }}⚠️ 注意事项:
- 变量名前必须加$符号(如$index, $article),否则会被解析为当前作用域的字段而非局部绑定变量;
- 若仅需索引而无需值,仍需保留占位变量(如{{range $i, $_ := $items}}),Go模板不支持单变量range解构;
- 索引始终为整数类型,可直接参与比较(如{{if eq $index 0}}<h2>首条推荐</h2>{{end}})或传递给自定义函数(如add $index 1实现1-based编号);
- 避免在嵌套range中复用相同变量名,否则外层变量会被覆盖,建议采用语义化命名(如$outerIdx, $innerItem)。
此外,若需更复杂的索引逻辑(如分页偏移、倒序索引),推荐在Go代码中预处理数据(例如注入Ordinal字段),而非在模板中进行复杂计算——这符合模板“只负责展示”的设计哲学,也利于维护与测试。

















