我想使用一个模板函数来扩展默认的Golang模板函数,该模板可以呈现另一个Golang模板,而该模板也应该有权访问有问题的函数。以下演示案例应创建一个模板函数,该函数呈现也可以包含相同函数的给定模板。但是,该示例(正确地)引发了初始化周期错误。includeincludeGolang 模板函数是否可以在引用自身时呈现另一个模板?https://play.golang.org/p/hml-GDhV1HIpackage mainimport ( "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)}
1 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
用:init()
var includeFuncs = map[string]interface{}{}
func includeFunc(templatePath string, data interface{}) (string, error) {...}
func init() {
includeFuncs["include"]=includeFunc
}
在原始帖子中,您陷入了初始化循环,因为在执行开始之前,运行时必须初始化所有初始化的变量,并且编译器会检测到初始化循环。
使用上述解决方案,初始化可以在程序启动之前完成,因为函数映射为空。在开始运行之前,该函数将运行并使用该函数初始化映射。maininit
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消