在上一节我们使用 “主页面内 加载 子模板“ 的方式实现了网站公共头部、底部引入的目的,我们还可以将一个站点公共的头部、底部、样式、js等封装为一个布局模板,然后在布局模板内部声明一个自定义区块,用于展示自定义内容。
{{define "layout"}}
<header>头部</header>
此处嵌入一个 body 模板用于展示不同的页面内容
{{template "body" .}}
<footer>底部</footer>
{{end}}
项目结构
|_ templates
|_ layout.html 核心布局模板
|_ index.html 网站首页模板
|_ abuoutus.html 完整关于我们模板
|_ main.go
layout.html 源码
{{define "layout"}}
<html>
<header style="background-color:#F5F5F5;">
<a href="/">首页</a>
<a href="/aboutus">关于我们</a>
</header>
<!-- 此处嵌入一个 body 模板用于展示不同的页面内容 -->
{{template "body" .}}
<footer style="background-color: gray;">底部</footer>
</html>
{{end}}
index.html 源码
{{define "body"}}
<h3>首页</h3>
{{end}}
aboutus.html 源码
{{define "body"}}
<h3>关于我们</h3>
{{end}}
在 main.go 中定义路由及调用不同的 body 模板
package main
import (
"fmt"
"html/template"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
varTest := "lesscode.work"
t := template.New("layout")
t, err := t.ParseFiles(
"./templates/layout.html",
"./templates/index.html")
if err != nil {
fmt.Printf("err: %v\n", err)
}
t.Execute(w, map[string]any{"varTest": varTest})
})
http.HandleFunc("/aboutus", func(w http.ResponseWriter, r *http.Request) {
varTest := "lesscode.work"
t := template.New("layout")
t, err := t.ParseFiles(
"./templates/layout.html",
"./templates/aboutus.html")
if err != nil {
fmt.Printf("err: %v\n", err)
}
t.Execute(w, map[string]any{"varTest": varTest})
})
http.ListenAndServe(":8080", nil)
}
以上演示可实现一个基础的网站模板构建,是网站开发时常用的模板嵌套方式。