如何在Go模板的if条件语句中调用可复用模板?
在Go模板的if条件中使用可复用模板输出的方法
你尝试的写法行不通——Go标准模板里的template动作是直接向输出流写入内容的,它不属于能返回值的表达式,所以没法直接放在if的条件判断(比如eq函数的参数)里使用。
要实现这个需求,你需要自定义一个模板函数,用来执行指定的可复用模板并返回其输出字符串,之后就能在条件判断里使用这个返回值了。
示例实现
首先在Go代码中注册一个自定义函数(比如叫render),用来捕获模板的输出:
package main import ( "bytes" "fmt" "html/template" "os" ) func main() { // 创建模板并注册自定义函数 tmpl := template.New("main").Funcs(template.FuncMap{ "render": func(tplName string, data interface{}) (string, error) { var buf bytes.Buffer // 执行指定模板并将输出写入buffer err := tmpl.ExecuteTemplate(&buf, tplName, data) if err != nil { return "", err } return buf.String(), nil }, }) // 解析模板内容 _, err := tmpl.Parse(` {{ define "test.tmpl" }}SomeExpectedValue{{ end }} Header {{- /* 先用自定义函数获取模板输出并赋值给变量 */ -}} {{- $tplOutput := render "test.tmpl" . -}} {{- if eq $tplOutput "SomeExpectedValue" }} The expected body: {{ $tplOutput }}. {{- else }} Something else. {{- end }} Footer `) if err != nil { fmt.Println(err) return } // 执行主模板 err = tmpl.Execute(os.Stdout, nil) if err != nil { fmt.Println(err) } }
代码说明
- 自定义的
render函数接收模板名称和数据,执行模板后将输出转为字符串返回。 - 在模板内部,先调用
render获取可复用模板的输出并赋值给变量$tplOutput。 - 之后就可以在
if条件里直接使用这个变量和目标字符串做比较了。
内容的提问来源于stack exchange,提问作者Ionel Sirbu
相关产品推荐
相关产品推荐

