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

Golang如何解析不同目录下的所有模板文件?

如何让Go模板同时解析多个目录下的文件

先说说你的场景:当前目录结构如下:

[root@abc]# ll
drwxr-xr-x. 2 root root 133 Mar 26 16:13 credit
drwxr-xr-x. 2 root root 132 Mar 26 16:17 form
-rw-r--r--. 1 root root 6003 Mar 27 19:30 main.go

你之前用var tmpl = template.Must(template.ParseGlob("form/*"))能正常解析form目录下的所有文件,但尝试传入两个模式参数"form/*","credit/*"却失效了——这是因为template.ParseGlob只接受单个模式字符串参数,多参数的写法不符合函数签名,自然不会生效。

下面给你两种可行的解决方案:

方法一:链式调用ParseGlob

你可以先创建一个空模板,然后链式调用两次ParseGlob,分别加载两个目录下的模板文件:

var tmpl = template.Must(template.New("").ParseGlob("form/*").ParseGlob("credit/*"))

这里template.New("")创建一个基础空模板,第一次ParseGlob("form/*")加载form目录的内容后,返回的模板对象可以继续调用ParseGlob("credit/*")来合并credit目录的模板,最后用template.Must处理初始化时的错误。

方法二:先收集文件路径,再统一加载

如果需要更灵活的控制(比如只加载特定后缀的模板文件),可以先用filepath.Glob分别获取两个目录的文件路径,合并后再用template.ParseFiles批量加载:

package main

import (
    "html/template"
    "path/filepath"
)

var tmpl *template.Template

func init() {
    // 获取form目录下的所有文件路径
    formFiles, err := filepath.Glob("form/*")
    if err != nil {
        panic(err)
    }
    // 获取credit目录下的所有文件路径
    creditFiles, err := filepath.Glob("credit/*")
    if err != nil {
        panic(err)
    }
    // 合并两个目录的文件列表
    allTemplateFiles := append(formFiles, creditFiles...)
    // 加载所有模板文件
    tmpl = template.Must(template.ParseFiles(allTemplateFiles...))
}

这种方法的优势是你可以在合并文件列表前做额外处理,比如筛选.tmpl或.html后缀的文件,适配更复杂的场景。

这两种方法都能实现你想要的同时解析两个目录模板的需求,根据你的实际场景选择就行~

内容的提问来源于stack exchange,提问作者talsa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:26:56