Go标准库的text/template和html/template包是常用的模板引擎,但是默认没有提供直接迭代整数范围的能力,当我们需要在模板中生成1到10的数字、或者循环指定次数时,就需要通过额外的方式实现整数范围迭代。

为什么Go模板没有内置整数范围迭代
Go的模板设计初衷是逻辑尽量放在后端代码中,模板只负责展示层的工作,因此没有内置太多复杂的逻辑功能。整数范围迭代属于偏逻辑的操作,官方更推荐在后端处理好数据再传递给模板,不过实际开发中确实存在需要在模板层直接处理的需求,因此我们可以通过扩展的方式实现。
方案一:自定义模板函数实现范围迭代
最灵活的方式是给模板注册自定义函数,生成一个整数切片供range使用。首先我们在后端定义生成整数范围的函数:
package main
import (
"html/template"
"net/http"
"os"
)
// 生成从start到end的整数切片,包含start和end
func rangeInt(start, end int) []int {
if start > end {
return []int{}
}
result := make([]int, 0, end-start+1)
for i := start; i <= end; i++ {
result = append(result, i)
}
return result
}
func main() {
// 定义模板内容,使用自定义的rangeInt函数
tplContent := `
<ul>
{{range rangeInt 1 5}}
<li>当前数字:{{.}}</li>
{{end}}
</ul>
`
// 创建模板并注册自定义函数
tpl := template.New("test")
tpl = tpl.Funcs(template.FuncMap{
"rangeInt": rangeInt,
})
// 解析模板
template.Must(tpl.Parse(tplContent))
// 执行模板,不需要额外传递数据
tpl.Execute(os.Stdout, nil)
}
上面的代码中,我们定义了rangeInt函数,接收起始和结束整数,返回对应的整数切片。然后在模板中通过{{range rangeInt 1 5}}就可以迭代1到5的整数,输出对应的列表项。
自定义函数的注意事项
- 自定义函数的参数类型需要和调用时传递的类型匹配,否则会报模板执行错误
- 如果函数有多个返回值,需要确保最后一个返回值是error类型,否则模板无法正确处理
- 对于html/template,自定义函数返回的内容会默认进行HTML转义,如果需要输出原始内容可以使用template.HTML类型
方案二:后端预生成整数切片传递
如果迭代的范围比较固定,或者不想自定义模板函数,也可以在后端先生成好整数切片,直接传递给模板使用:
package main
import (
"html/template"
"net/http"
"os"
)
func main() {
// 后端生成1到10的整数切片
nums := make([]int, 0, 10)
for i := 1; i <= 10; i++ {
nums = append(nums, i)
}
// 定义模板
tplContent := `
<div class="num-list">
{{range .Nums}}
<span class="num-item">{{.}}</span>
{{end}}
</div>
`
tpl := template.Must(template.New("test").Parse(tplContent))
// 传递数据给模板
data := map[string]interface{}{
"Nums": nums,
}
tpl.Execute(os.Stdout, data)
}
这种方式的逻辑完全放在后端,符合Go模板的设计理念,模板只需要做简单的展示,适合迭代范围由后端逻辑决定的场景。
两种方案的对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 自定义模板函数 | 灵活,模板中可以直接指定范围,不需要后端额外处理 | 需要注册自定义函数,模板逻辑稍复杂 | 迭代范围由模板层决定,或者多个模板需要复用范围迭代逻辑 |
| 后端预生成切片 | 逻辑清晰,符合模板设计理念,不需要扩展模板功能 | 模板无法自主决定迭代范围,需要后端传递数据 | 迭代范围由后端逻辑决定,或者项目规范限制模板自定义函数 |
常见问题解答
迭代从0开始的范围怎么处理
如果是自定义函数方案,直接调用rangeInt 0 4就可以得到0到4的整数;如果是后端预生成,循环的时候从0开始即可。
如何实现步长不为1的迭代
可以扩展自定义函数,增加步长参数,比如定义rangeIntWithStep(start, end, step int)函数,按照步长生成切片即可,示例如下:
// 带步长的整数范围生成函数,step为正整数
func rangeIntWithStep(start, end, step int) []int {
if step <= 0 || start > end {
return []int{}
}
result := make([]int, 0)
for i := start; i <= end; i += step {
result = append(result, i)
}
return result
}
调用的时候使用{{range rangeIntWithStep 0 10 2}}就可以迭代0、2、4、6、8、10这些偶数。
Go模板整数范围迭代template_range自定义函数text_template修改时间:2026-07-15 22:21:35