Golang 模板函数是否可以在引用自身的同时渲染另一个模板?

Is it possible for a Golang template function to render another template while referring to itself?

我想使用呈现另一个 Golang 模板的模板函数扩展默认的 Golang 模板函数,而该模板也应该可以访问相关函数。

下面的演示案例应该创建一个 include 模板函数来呈现给定的模板,该模板也可以包含相同的 include 函数。但是,该示例(正确地)引发了初始化循环错误。

Golang 模板函数是否可以在引用自身的同时渲染另一个模板?

https://play.golang.org/p/hml-GDhV1HI

package main

import (
    "bytes"
    "errors"
    html_template "html/template"
    "os"
)

var includeFuncs = map[string]interface{}{
    "include": func(templatePath string, data interface{}) (string, error) {
        templatePath = "templates/" + templatePath
        if _, err := os.Stat(templatePath); err != nil {
            return "", errors.New("Unable to find the template file " + templatePath)
        }

        var renderedTpl bytes.Buffer
        tpl, err := html_template.New(templatePath).Funcs(GetHTMLIncludeFuncs()).Parse(templatePath)
        if err != nil {
            return "", err
        }

        if err := tpl.Execute(&renderedTpl, data); err != nil {
            return "", err
        }

        return renderedTpl.String(), nil
    },
}

func GetHTMLIncludeFuncs() html_template.FuncMap {
    return html_template.FuncMap(includeFuncs)
}

使用init():

var includeFuncs = map[string]interface{}{}

func includeFunc(templatePath string, data interface{}) (string, error) {...}

func init() {
   includeFuncs["include"]=includeFunc
}

在原来的post中,你陷入了一个初始化循环,因为在执行开始之前,运行时必须初始化所有初始化变量,编译器检测到初始化循环。

采用上述方案,由于函数映射为空,所以可以在程序启动前完成初始化。在 main 启动 运行 之前,init 函数运行并用函数初始化地图。