为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 模板函数是否可以在引用自身时呈现另一个模板?

Golang 模板函数是否可以在引用自身时呈现另一个模板?

Go
largeQ 2022-10-04 16:04:33
我想使用一个模板函数来扩展默认的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


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信