如何将map引用传递给Go语言的WalkDirFunc
Go中向filepath.WalkDir传递自定义map的方法
在Go里,要给filepath.WalkDir的回调函数传递自定义的map[string]uint32,最常用且优雅的方式是闭包,也可以通过结构体封装上下文,以下是具体实现:
方法一:闭包(推荐)
闭包可以捕获外部作用域的变量,直接在回调逻辑中操作目标map,完全适配WalkDirFunc的签名要求:
package main import ( "os" "path/filepath" ) func main() { fileSizeMap := make(map[string]uint32) // 定义符合WalkDirFunc签名的闭包 walkFunc := func(path string, d os.DirEntry, err error) error { if err != nil { return err } // 仅处理文件,跳过目录 if !d.IsDir() { info, err := d.Info() if err != nil { return err } // 将文件路径和大小存入map fileSizeMap[path] = uint32(info.Size()) } return nil } // 启动目录遍历 err := filepath.WalkDir("./target-dir", walkFunc) if err != nil { panic(err) } // 输出结果 for path, size := range fileSizeMap { println(path, size) } }
方法二:结构体封装上下文
如果需要传递更多复杂的上下文数据,可以把map封装到结构体中,用结构体方法作为回调函数:
package main import ( "os" "path/filepath" ) // 封装上下文的结构体 type FileSizeCollector struct { SizeMap map[string]uint32 } // 实现WalkDirFunc签名的方法 func (c *FileSizeCollector) Walk(path string, d os.DirEntry, err error) error { if err != nil { return err } if !d.IsDir() { info, err := d.Info() if err != nil { return err } c.SizeMap[path] = uint32(info.Size()) } return nil } func main() { collector := FileSizeCollector{ SizeMap: make(map[string]uint32), } // 传递结构体方法作为回调 err := filepath.WalkDir("./target-dir", collector.Walk) if err != nil { panic(err) } for path, size := range collector.SizeMap { println(path, size) } }
不推荐的方式:全局变量
虽然可以用全局map让回调直接访问,但这种方式会降低代码复用性,并发场景下还容易出现数据竞争,非必要不要使用。
内容的提问来源于stack exchange,提问作者John Harrington
相关产品推荐
相关产品推荐

