Gin框架html/template自定义函数未生效问题求助
解决Gin框架Multitemplate模板自定义函数未定义的Panic错误
问题原因
- 仅为
hrm_views/*/*.html路径下的子目录模板配置了自定义函数映射,hrm_views/*.html根目录下的模板(如leave-compose.html)未添加函数配置,导致模板调用{{my_func}}时触发未定义错误。 - 第二个循环中先通过
AddFromFiles加载不带函数的模板,再调用AddFromFilesFuncs加载同名带函数的模板,属于冗余操作,可能引发模板加载冲突。
解决方案
统一为所有模板(根目录及子目录)添加自定义函数映射,使用AddFromFilesFuncs替代AddFromFiles加载模板,同时复用全局函数映射避免重复代码。
修改后的模板加载函数代码
func LoadTemplates(templatesDir string) multitemplate.Renderer { r := multitemplate.NewRenderer() // 定义全局自定义函数映射 funcMap := template.FuncMap{ "my_func": func() string { return "xyz" }, } // 加载hrm布局模板 hrmLayouts, err := filepath.Glob(templatesDir + "/hrm_views/layouts/base.html") if err != nil { panic(err.Error()) } // 加载hrm_views根目录下的页面模板 hrm_pages, err := filepath.Glob(templatesDir + "/hrm_views/*.html") if err != nil { panic(err.Error()) } for _, page := range hrm_pages { layoutCopy := make([]string, len(hrmLayouts)) copy(layoutCopy, hrmLayouts) files := append(layoutCopy, page) // 带自定义函数加载模板 r.AddFromFilesFuncs(filepath.Base(page), funcMap, files...) } // 加载hrm_views子目录下的页面模板 hrm_pages, err = filepath.Glob(templatesDir + "/hrm_views/*/*.html") if err != nil { panic(err.Error()) } for _, page := range hrm_pages { layoutCopy := make([]string, len(hrmLayouts)) copy(layoutCopy, hrmLayouts) files := append(layoutCopy, page) // 带自定义函数加载模板 r.AddFromFilesFuncs(filepath.Base(page), funcMap, files...) } return r }
关键修改点
- 提取全局
funcMap,集中管理所有自定义函数。 - 两个循环均使用
AddFromFilesFuncs加载模板,确保所有页面模板都能访问自定义函数。 - 移除第二个循环中冗余的
AddFromFiles调用,避免重复加载同名模板。
修改后,所有模板(包括根目录的leave-compose.html)均可正确识别my_func函数,不会再触发未定义的panic。
内容的提问来源于stack exchange,提问作者Shakhawat Hossain
相关产品推荐
相关产品推荐

