
go模板不支持直接使用复合字面量语法创建数组或切片,但可通过自定义函数(如slice)在模板中动态构造包含常量值的切片,实现类似数组的绑定与遍历。
go模板不支持直接使用复合字面量语法创建数组或切片,但可通过自定义函数(如slice)在模板中动态构造包含常量值的切片,实现类似数组的绑定与遍历。
在Go模板中,无法像Go代码那样直接写 []string{"a", "b", "c"} 或 {"a", "b", "c"} 来声明数组或切片——所有尝试如 {{ $groups := {"a", "b", "c"} }}、{{ $groups := ["a", "b", "c"] }} 均会触发解析错误,因为模板语法不支持复合字面量(composite literals)。
✅ 正确做法是:注册一个自定义模板函数,将多个参数收集成一个 []interface{} 切片,并在模板中调用它。
1. 定义并注册 slice 函数
func slice(v ...interface{}) []interface{} {
return v
}
// 注册到模板
t := template.New("example").
Funcs(template.FuncMap{"slice": slice})
t, _ = t.Parse(`{{$groups := slice "a" "b" "c"}}{{range $groups}}{{.}} {{end}}`)
2. 在模板中使用
{{$groups := slice "admin" "editor" "viewer"}}
-
{{range $groups}}
- {{.}} {{end}}
输出:
一款AI开发辅助工具,主要用于使用 OpenCLI 工具,可从各类网站及桌面应用中提取数据、下载媒体内容、控制外部 CLI 工具。支持 Bilibili、知乎、小红书、Twitter/X、Reddit、YouTube、Boss直聘、即刻、微博等 30+ 个平台,以及 Cursor、Codex、ChatGPT、Notion 等桌面应用。当用户需要:从社...,适合需要提升相关任务效率的用户。
- admin
- editor
- viewer
⚠️ 注意事项:
- slice 函数返回 []interface{},因此其中元素在模板中需通过 {{.}} 直接访问;若需类型安全操作(如调用字符串方法),建议在Go代码中预处理为具体类型切片并传入数据上下文。
- 所有参数会被统一转为 interface{},因此混合类型(如 slice "hello" 42 true)是合法的,但应确保模板逻辑能兼容。
- 该方案适用于简单常量列表场景;若数组内容固定且频繁复用,更推荐在 Go 侧构造好 []string 并作为 .Groups 等字段传入模板,语义更清晰、性能更优。
通过 slice 函数,你就能在模板内部灵活“声明”常量集合,兼顾简洁性与可维护性。










