Gin框架中使用HTMLGlob加载嵌套子目录模板报错求助
解决Gin框架中HTMLGlob加载模板子目录的报错问题
错误原因
Gin的LoadHTMLGlob会尝试读取所有匹配glob模式的路径,但你使用的./templates/**/*模式会把子目录本身(比如templates/components/tables)也纳入匹配范围。而Gin无法将目录作为模板文件读取,因此抛出read templates\components\tables: Incorrect function错误——无论目录内是否有模板文件,只要匹配到目录就会触发该问题。
解决方案
核心思路是让glob模式只匹配模板文件,而非目录本身,以下是几种可行方案:
方案一:匹配特定后缀的模板文件
如果你的模板文件统一使用.html后缀(或其他固定后缀),直接在glob模式中指定后缀即可:
r.LoadHTMLGlob("./templates/**/*.html")
该模式会递归匹配templates目录下所有层级的.html文件,完全避开目录本身。
方案二:分层级匹配(适用于固定目录结构)
如果你的模板目录层级固定(比如最多3层),可以多次调用LoadHTMLGlob分别匹配不同层级的文件:
// 匹配根目录下的一级子目录文件 r.LoadHTMLGlob("./templates/*/*.html") // 匹配二级子目录文件(比如components/tables下的模板) r.LoadHTMLGlob("./templates/*/*/*.html")
这种方式适合目录结构稳定的场景,但扩展性较差,新增层级时需要补充对应的匹配规则。
方案三:手动遍历目录加载模板
如果glob模式无法满足需求,可通过手动遍历目录的方式加载所有模板文件,灵活性更高:
import ( "io/fs" "path/filepath" ) // 递归遍历templates目录下所有模板文件 err := filepath.WalkDir("./templates", func(path string, d fs.DirEntry, err error) error { if err != nil { return err } // 仅加载非目录的.html文件 if !d.IsDir() && filepath.Ext(path) == ".html" { r.LoadHTMLFiles(path) } return nil }) if err != nil { panic(err) }
该方式不受目录层级限制,能自动识别所有符合后缀的模板文件,同时完全避免读取目录的问题。
内容的提问来源于stack exchange,提问作者ancient geek
相关产品推荐
相关产品推荐

