本文主要解决在多租户场景下的模板渲染问题。 正常情况下 Gin 配置的所有模板都属于同一个模板组合,相同名称的模板将相互覆盖。在未通过 define 指定模板名称时,同名模板文件也将相互覆盖。自定义函数中也无法区分租户,这将非常不方便我们进行多租户的模板渲染处理。通过自定义 HTML 渲染器,将一一解决这些问题。 一、Gin 源码分析 Gin 通过 router.LoadHTMLGlob 或 router.LoadHTMLFiles 函数初始化 HTML 模板,这两个函数的源码如下。 // LoadHTMLGlob loads HTML files identified by glob pattern// and associates the result with HTML renderer.func (engine *Engine) LoadHTMLGlob(pattern string) {left := engine.delims.Leftright := engine.delims.Right // 初始化模板templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern))if IsDebugging() {debugPrintLoadTemplate(templ)engine.HTMLRender = render.HTMLDebug{Glob: pattern, FuncMap: engine.FuncMap, Delims: engine.delims}return}engine.SetHTMLTemplate(templ)}// LoadHTMLFiles loads a slice of HTML files//...