go - 使用文件路径在 Go 中搜索文件
问题描述
我正在尝试使用 Go 在目录中查找文件。我正在使用文件路径包中的 Walk 功能。在 findFile 函数中,我获取文件并将指针分配给正在传递的文件。但这似乎不起作用,调用findFile后file的值仍然是nil。如果我做错了什么或者这种方法不正确,请提出建议。
func example() {
var file *os.File
err = filepath.Walk("uploads", findFile(fileId, file))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
}
func findFile(fileId string, file *os.File) func(path string, info os.FileInfo, err error) error {
return func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && isFileMatching(info.Name(), fileId) {
file, err = os.Open(path)
if err != nil {
return err
}
}
return nil
}
}
解决方案
您正在更改指针变量的值,而不是指针指向的值。
它应该是:
f, err := os.Open(path)
if err != nil {
return err
}
*file = *f
笔记:
*file = *f
实际上是一个副本os.File
。
这不是一个好习惯。您可能需要考虑使用通道(和 goroutine)来完成此类工作。
而且您可能还想检查是否只有一个路径可以通过isFileMatching
,或者它是文件描述符泄漏(不关闭打开的文件)。
推荐阅读
- mysql - Mysql:ALTER TABLE 不锁定表?
- perl - 使用 crontab 通过 perl 调用 Java 程序时不运行
- javascript - 是否可以向使用 ReactJS 制作的 Todo 应用程序添加编辑功能?
- java - 如何强制特定的测试类在单独的 jvm 中执行?
- haskell - 安装 zlib 时 ghc.exe 无法执行 ld.exe
- javascript - Javascript - 在一系列跨度之上添加一个新的 DIV
- python - Pynput:计算按键次数
- mongodb - MongoDB 坚持使用“索引构建:耗尽构建期间收到的写入”消息创建索引
- ruby-on-rails - 将 mongomapper 替换为 mongoid 并更新 mongo 驱动程序后无法正确读取集合
- mysql - “BACKUP”在此位置无效