просто базовое решение было бы следующим:
package main
import (
"fmt"
"os"
"text/template"
)
func main() {
//read in one go the header, footer and all your other tmpls.
//append to that slice every time the relevant content that you want rendered.
alltmpls := []string{"./layouts/header.tmpl", "./layouts/footer.tmpl", "./users/index.tmpl"}
templates, err := template.ParseFiles(alltmpls...)
t := templates.Lookup("header.tmpl")
t.ExecuteTemplate(os.Stdout, "header", nil)
t = templates.Lookup("index.tmpl")
t.ExecuteTemplate(os.Stdout, "index", nil)
t = templates.Lookup("footer.tmpl")
t.ExecuteTemplate(os.Stdout, "footer", nil)
}
на самом деле вы хотели бы функцию, которая возвращает кусок соответствующих файлов для заполнения переменной alltmpls.Он должен отсканировать ваши каталоги и получить все файлы оттуда для передачи в ParseFiles (), а затем приступить к вызову шагов Lookup и ExecuteTemplate для каждого шаблона.
Если продолжить эту идею, я бы создал новый тип, который будетвстроить шаблон (или часть шаблонов) для аннотирования с помощью верхнего и нижнего колонтитула.
type hftemplate struct {
template.Template
header, footer *template.Template
}
func (h *hftemplate) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
h.header.ExecuteTemplate(wr, "header", nil)
err := h.ExecuteTemplate(wr, name, data)
h.footer.ExecuteTemplate(wr, "footer", nil)
return err
}
и, конечно, вы можете превратить встраивание этой структуры в полноценное поле [] Template, чтобы сделать несколькоExecuteTemplates между верхним и нижним колонтитулами.