Go语言标准库中的path/filepath包提供了filepath.Glob函数,用于根据指定的模式匹配对应路径下的文件,返回所有匹配到的文件路径列表。在实际开发中,我们往往需要根据运行时的参数动态指定要匹配的目录,而不是写死固定的路径,这就需要结合字符串拼接等方式灵活构造匹配模式。

filepath.Glob函数基础用法
filepath.Glob的函数签名如下:
func Glob(pattern string) (matches []string, err error)
它接收一个模式字符串作为参数,返回所有匹配该模式的文件路径切片,以及可能的错误。模式中的通配符遵循Go语言的通配符规则,*匹配任意数量的非分隔符字符,?匹配单个非分隔符字符,[...]匹配指定范围内的单个字符。
基础的固定路径匹配示例如下:
package main
import (
"fmt"
"path/filepath"
)
func main() {
// 匹配当前目录下所有的txt文件
matches, err := filepath.Glob("*.txt")
if err != nil {
fmt.Println("匹配出错:", err)
return
}
fmt.Println("匹配到的文件:", matches)
}
动态指定目录的实现方式
要实现动态指定目录,核心是先获取目标目录的路径,再将目录路径和文件匹配模式拼接成完整的pattern参数。常见的动态目录来源包括命令行参数、配置文件、运行时生成的路径等。
从命令行参数获取动态目录
通过os.Args获取用户输入的目录路径,再拼接匹配模式:
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
)
func main() {
// 检查是否传入目录参数
if len(os.Args) < 2 {
fmt.Println("请传入要匹配的目录路径")
return
}
targetDir := os.Args[1]
// 确保目录路径以路径分隔符结尾,避免拼接错误
if !strings.HasSuffix(targetDir, string(filepath.Separator)) {
targetDir = targetDir + string(filepath.Separator)
}
// 拼接匹配模式:动态目录下的所有go文件
pattern := targetDir + "*.go"
matches, err := filepath.Glob(pattern)
if err != nil {
fmt.Println("匹配出错:", err)
return
}
if len(matches) == 0 {
fmt.Println("未匹配到任何go文件")
return
}
fmt.Println("匹配到的go文件:")
for _, path := range matches {
fmt.Println(path)
}
}
结合运行时逻辑生成动态目录
如果目录是程序运行时动态生成的,比如根据当前时间生成的日志目录,也可以直接拼接路径:
package main
import (
"fmt"
"path/filepath"
"time"
)
func main() {
// 模拟运行时生成的动态目录,比如按日期生成的日志目录
logBaseDir := "./logs"
currentDate := time.Now().Format("2006-01-02")
dynamicDir := filepath.Join(logBaseDir, currentDate)
// 匹配动态目录下的所有.log文件
pattern := filepath.Join(dynamicDir, "*.log")
matches, err := filepath.Glob(pattern)
if err != nil {
fmt.Println("匹配出错:", err)
return
}
fmt.Println("匹配到的日志文件:", matches)
}
注意事项
- 路径分隔符处理:不同操作系统的路径分隔符不同,建议使用
filepath.Join函数拼接路径,它会自动适配当前系统的分隔符,避免手动拼接导致的跨平台问题。 - 通配符限制:filepath.Glob不支持
**递归匹配子目录的模式,如果需要递归匹配所有子目录下的文件,需要结合filepath.Walk函数自行实现逻辑。 - 模式合法性:如果传入的pattern包含不合法的通配符序列,函数会返回错误,使用前可以对输入的目录进行合法性校验。
常见问题解答
匹配不到文件时返回什么
当没有匹配到任何文件时,filepath.Glob会返回空的字符串切片,同时err为nil,因此判断是否有匹配结果时,需要先检查err,再判断切片的长度。
如何匹配多个类型的文件
filepath.Glob不支持一次传入多个模式,如果需要匹配多种类型的文件,可以多次调用Glob函数,然后合并结果:
package main
import (
"fmt"
"path/filepath"
)
func main() {
targetDir := "./"
var allMatches []string
// 匹配txt和md文件
patterns := []string{
filepath.Join(targetDir, "*.txt"),
filepath.Join(targetDir, "*.md"),
}
for _, pattern := range patterns {
matches, err := filepath.Glob(pattern)
if err != nil {
fmt.Println("匹配模式", pattern, "出错:", err)
continue
}
allMatches = append(allMatches, matches...)
}
fmt.Println("所有匹配的文件:", allMatches)
}
filepath_GlobGo语言文件模式匹配动态目录修改时间:2026-06-26 07:30:25