go template - 嵌套模板化

标签 go go-templates

我有几个 go 模板。下面的例子过于简单,但它正确地表达了我的想法。例如,我有

{{ define "div-block" }}
   <div style="display:block">
         .....
   </div>
{{ end }}

现在我想在使用 div-block 时转移任何其他模板,这样我就可以在 div 中放置任何东西。例如:

{{ template "div-block" . }}
    {{ template "header" }}
{{ end }}

{{ template "div-block" . }}
    <ul>
       <li>1</li>
    </ul>
{{ end }}

“标题”是其他模板。

使用 go 模板执行此操作的正确方法是什么?是否可以使用自定义功能来做到这一点?是否可以在 go 模板中制作自定义 actions? ( Action 可以有 end 语句,因此也有主体,而函数则没有)

最佳答案

你可以在 go 模板中使用嵌套模板。

divBlock := `<div>Hello div
                {{block "header" .}} {{.}} {{end}}
             </div>`
header := `<header>Hello Header</header>`

divTempl, err := template.New("master").Parse(divBlock)
if err != nil {
    log.Fatal(err)
}
if err := divTempl.Execute(os.Stdout, header); err != nil {
    log.Fatal(err)
}

Playground 链接:https://play.golang.org/p/K36l3bn5753

或者

您可以使用 if 语句。检查是否有一些模板,然后追加,否则为空。

const (
    divBlock = `<div style="display:block">
                 .....
            {{if "injectedTmpl"}}{{.}}{{end}}
           </div>`
)   
injectedTmpl := `<header>Hello Header</header>`

divTmpl, err := template.New("div").Parse(divBlock)
if err != nil {
    log.Fatal(err)
}
if err := divTmpl.Execute(os.Stdout, injectedTmpl); err != nil {
    log.Fatal(err)
}

Playground 链接:https://play.golang.org/p/pZaqXtCHHAL

关于go template - 嵌套模板化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48524388/

相关文章:

docker - 容器不会连接到 redis 容器

dns - 如何在 Go 中查找 NAPTR 记录?

rest - golang 中的参数处理

kubernetes - 使用 go-template 从 kubectl 输出中提取 LoadBalancer 名称

go - 在 golang 中使用 template.ParseFiles 的多个文件

docker - 如何从docker-compose文件中查看容器的容器健康状态

go - 关于 golang HandlerFunc。我预计 404 未找到但是

go - 将查询结果插入现有的BigQuery表

performance - 我应该在每个 http 请求上调用 template.ParseFiles(...) 还是只从主函数调用一次?

go - 在Go中将html字符串解析为模板