Có nó là có thể. A html.Template
thực sự là một tập hợp các tệp mẫu. Nếu bạn thực thi một khối đã xác định trong tập hợp này, nó có quyền truy cập vào tất cả các khối khác được xác định trong tập hợp này.
Nếu bạn tự mình tạo một bản đồ gồm các bộ mẫu như vậy, về cơ bản bạn có tính linh hoạt giống như Jinja / Django cung cấp. Sự khác biệt duy nhất là gói html / template không có quyền truy cập trực tiếp vào hệ thống tệp, vì vậy bạn phải phân tích cú pháp và soạn các mẫu theo ý mình.
Hãy xem xét ví dụ sau với hai trang khác nhau ("index.html" và "other.html") đều kế thừa từ "base.html":
{{define "base"}}<html>
<head>{{template "head" .}}</head>
<body>{{template "body" .}}</body>
</html>{{end}}
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}
Và bản đồ bộ mẫu sau:
tmpl := make(map[string]*template.Template)
tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html"))
tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))
Bây giờ bạn có thể hiển thị trang "index.html" của mình bằng cách gọi
tmpl["index.html"].Execute("base", data)
và bạn có thể hiển thị trang "other.html" của mình bằng cách gọi
tmpl["other.html"].Execute("base", data)
Với một số thủ thuật (ví dụ: quy ước đặt tên nhất quán cho các tệp mẫu của bạn), bạn thậm chí có thể tạo tmpl
bản đồ tự động.