
Go 的 text/template 包支持通过 pipeline 向 partial 模板传参,核心是利用 {{template "name" pipeline}} 语法将值赋给子模板中的 .(当前上下文),再通过变量绑定(如 {{ $foo := . }})实现具名参数语义。
go 的 `text/template` 包支持通过 pipeline 向 partial 模板传参,核心是利用 `{{template "name" pipeline}}` 语法将值赋给子模板中的 `.`(当前上下文),再通过变量绑定(如 `{{ $foo := . }}`)实现具名参数语义。
在 Go 模板中,template 动作不支持直接传入命名参数(如 foo=true),但提供了灵活且符合 Go 惯用法的替代方案:以 pipeline 形式传递任意数据,该数据将成为被调用 partial 模板的 .(即当前上下文对象)。这意味着你无需依赖 Ruby 风格的哈希传参,而是通过结构化数据 + 变量绑定来实现清晰、类型安全的 partial 复用。
✅ 正确用法:使用 pipeline 传参并绑定变量
假设你有一个 partial 模板 _partial1.tmpl,期望根据布尔值 foo 控制内容渲染:
<!-- _partial1.tmpl -->
<div>
text1
{{if .}}
text2
{{end}}
</div>注意:此处直接使用 {{if .}} —— 因为 . 就是你从父模板传入的值(例如 true 或 "hello")。若需更语义化的变量名(如 foo),可在 partial 内部显式声明:
<!-- _partial1.tmpl -->
{{ $foo := . }}
<div>
text1
{{if $foo}}
text2
{{end}}
</div>父模板 parent.tmpl 中调用时,只需将所需值作为 pipeline 传入:
<!-- parent.tmpl -->
<div>
{{ template "_partial1.tmpl" true }} <!-- 传 bool -->
{{ template "_partial1.tmpl" false }}
{{ template "_partial1.tmpl" "hello" }} <!-- 传 string -->
</div>? 完整可运行示例
main.go
package main
import (
"html/template"
"os"
)
func main() {
t, err := template.ParseFiles("parent.tmpl", "_partial1.tmpl")
if err != nil {
panic(err)
}
// 传 nil data 给根模板(因 parent.tmpl 未使用 .,仅用于组织 partial)
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}运行后输出:
<div>
<div>
text1
text2
</div>
<div>
text1
</div>
<div>
text1
text2
</div>
</div>? 关键提示:
- {{template "name" pipeline}} 中的 pipeline 可以是字面量(true, 42, "ok")、变量(.IsAdmin)、函数调用(now)、或管道表达式("foo" | upper);
- 若需传递多个参数,应封装为结构体或 map,并在 partial 中解构(例如 {{.Name}}, {{.Active}});
- 不推荐滥用 . 传递复杂逻辑——建议将业务逻辑前置到 Go 代码中,模板专注展示,保持关注点分离;
- partial 模板名必须在 ParseFiles 或 ParseGlob 中显式加载,否则会报 template: ... not defined 错误。
通过合理运用 . + 变量绑定({{ $foo := . }}),你既能获得 Ruby 风格的语义清晰度,又完全遵循 Go 模板的设计哲学:简洁、明确、无隐式行为。


















