You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:22:09