php小編柚子為您介紹一個有關變數參考傳遞的重要概念-將變數參考傳遞給WalkDirFunc。在PHP中,變數引用傳遞是一種傳遞方式,它允許我們將一個變數的引用傳遞給函數或方法,從而在函數內部對該變數進行修改。透過這種方式,我們可以避免在函數內部建立新的變數副本,並提高程式碼的執行效率。 WalkDirFunc是一個範例函數,它可以遍歷指定目錄下的所有檔案並對其進行操作。將變數參考傳遞給WalkDirFunc可以使我們在函數內部直接對傳入的變數進行操作,而無需傳回修改後的結果。這種方式在處理大量資料時特別實用,可以減少記憶體開銷並提高程式碼的可讀性和可維護性。
我正在努力遞歸地迭代給定目錄並將找到的檔案的名稱及其大小儲存在 map[string]uint32
中。我發現一篇文章描述如何使用 path/filepath/walkdir 函數和 walkdirfunc 遞歸地遍歷指定目錄。
我對 go 比較陌生,無法找到一種方法將對我的地圖的引用傳遞給 walkdirfunc
,因為它的簽名僅指定三個參數:
func main() { args := os.args if len(args) != 2 { msg := fmt.sprintf("usage: %v <path_to_directory>", args[0]) log.fatal(msg) } fullpath := args[1] dirmap := make(map[string]uint32) filepath.walkdir(fullpath, walk) } // how to create parameter accepting &map[string]uint32 func walk(path string, entry fs.direntry, err error) error { if err != nil { return err } if !entry.isdir() { // add entry and it's size to dirmap file, err := os.stat(path) if err != nil { log.println("error determining file size:", err) } size := file.size() // add path and size to dirmap } else if entry.isdir() { // recurse here } else { log.println("unhandled branch:") log.println(entry.info()) } return nil }
編輯:由於walk
是傳遞給filepath.walkdir
的walkdirfunc
,因此有必要傳遞從這裡開始的地圖。在 python 中,我會使用命名參數來完成此任務,但 go 中最好的方法是什麼?
func main() { args := os.Args ... fullPath := args[1] dirMap := make(map[string]uint32) // dirMap should be passed here filepath.WalkDir(fullPath, walk) }
使用閉包。更改步行至:
func walk(dirmap map[string]uint32, path string, entry fs.direntry, err error) error { ... }
像這樣呼叫 walkdir:
dirMap := make(map[string]uint32) filepath.WalkDir(fullPath, func(path string, entry fs.DirEntry, err error) error { return walk(dirMap, path, entry, err) })
在此處運行範例:https://www.php.cn/link/178fde6398864e33aaefae5d2d855f20
以上是將變數參考傳遞給 WalkDirFunc的詳細內容。更多資訊請關注PHP中文網其他相關文章!