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
函数运行并用函数初始化地图。
我想使用呈现另一个 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
函数运行并用函数初始化地图。