大家好,離子又來了。
害怕學習人工智慧有一天會完成的事情讓我感到非常痛苦。但是,如果「解決問題」仍然是對未來人類的要求,為什麼不堅持呢?
這次我又帶來了一個教學。比第一個沒啥用。那我們來定義一下「問題」的結構,因為我們已經知道一件事:那些沒有問題的人,是因為他們看起來不夠。對於那些還沒有找到它們的人來說,創建它們只是時間問題。
程式最簡單的結構是:
建立目錄並導航到它:
mkdir organizador cd organizador
建立一個 Organizer.go 檔案並啟動其模組:
touch organizador.go go mod init organizador.go
你應該有或多或少像這樣的東西:
~/organizador . ├── go.mod └── organizador.go
讓我們定義來源目錄dirOrigem,我們將在其中執行組織。定義後,我們檢查它是否確實存在,否則我們將回傳錯誤:
package main import ( "fmt" "os" ) // Defina o deretório o qual você quer organizar como variável global var dirOrigem string := "/Users/User/Downloads" // Troque o diretório func main() { // Verificar se o diretório existe, caso contrário, retornar erro if _, err := os.Stat(dirOrigem); os.IsNotExist(err) { fmt.Println("BAD DIR :( \nDiretório não encontrado: ", dirOrigem) return } else { // Imprimir mensagem caso o diretório exista fmt.Println("GOOD DIR :) \nDiretório encontrado: ", dirOrigem) } }
現在,讓我們對上面的程式碼做一些考慮:
你有沒有註意到,我們在這裡一點一點地享受機械式鍵盤聲音的比特和位元組。 _查卡查卡繁榮! _
現在我們要建立一個回呼函數。這是我從未真正了解過的東西,或者從來沒有足夠的好奇心去質疑我是否在前 golang 生活中的任何 Python 程式碼中使用過這個概念。
回呼函數是一個帶有參數傳遞給另一個函數的函數。
如果您已經熟悉這個概念,那麼恭喜您,否則,恭喜您。換句話說,恭喜你!
現在讓我們建立一個 filepath.Walk 回呼函數,它將作為參數傳遞給另一個函數。
mkdir organizador cd organizador
touch organizador.go go mod init organizador.go
但是等等,filepath.Walk 是如何呼叫回呼函數的呢?
當您呼叫 filepath.Walk(sourcedir, listFiles) 時,filepath.Walk 函數會執行遍歷 sourcedir 中的所有檔案和子目錄的繁重工作。
對於找到的每個檔案或目錄,它都會使用三個參數來呼叫 listFiles 函數:
Go 自動理解 listFiles 必須接收這三個參數,因為 filepath.Walk 期望一個完全遵循此簽章的函數:
~/organizador . ├── go.mod └── organizador.go
請注意,Walk 函數回傳一個錯誤!這是相關的!
這就是為什麼我們將函數 filepath.Walk(dirOrigem,listarArquivos) 等同於錯誤:
package main import ( "fmt" "os" ) // Defina o deretório o qual você quer organizar como variável global var dirOrigem string := "/Users/User/Downloads" // Troque o diretório func main() { // Verificar se o diretório existe, caso contrário, retornar erro if _, err := os.Stat(dirOrigem); os.IsNotExist(err) { fmt.Println("BAD DIR :( \nDiretório não encontrado: ", dirOrigem) return } else { // Imprimir mensagem caso o diretório exista fmt.Println("GOOD DIR :) \nDiretório encontrado: ", dirOrigem) } }
畢竟,因為它回傳一個錯誤,所以它是一個錯誤XD
以下更詳細地介紹了每一步發生的情況:
func main() { // Restante do código . . . // Percorrer e listar os arquivos no diretório dirOrigem err := filepath.Walk(dirOrigem, listarArquivos) if err != nil { fmt.Println("Erro ao percorrer o diretório: ", err) } }
對於 dirOrigem 中的每個檔案或目錄,filepath.Walk 將呼叫 listFiles,就好像它是這樣的:
// Função que lista os arquivos do diretório func listarArquivos(caminho string, info os.FileInfo, err error) error { if err != nil { return err } // Ignorar diretórios e exibir apenas arquivos if !info.IsDir() && !strings.HasPrefix(info.Name(), ".") { fmt.Println("Arquivo encontrado: ", info.Name()) } return nil }
在此範例中,對於每個呼叫:
listFiles 是 filepath.Walk 使用這些值自動呼叫的回呼函數。這樣,我們就不需要擔心設定path、info和err值; filepath.Walk 已經為我們做到了這一點。
PHE!
現在在你的終端上進行頑皮的測試:
// Função Walk() func Walk(root string, walkFn WalkFunc) error // Tipo WalkFunc type WalkFunc func(path string, info os.FileInfo, err error) error
你可以得到結果:
err := filepath.Walk(dirOrgiem, listarArquivos)
或:
//Percorrer e listar os arquivos no diretório err := filepath.Walk(dirOrigem, listarArquivos)
在這種情況下,我只是在“下載”中添加了一個額外的“s”,這樣原始目錄就會不正確。
現在刪除 listFiles 函數,因為我們不會使用它。
開個玩笑,我們只是要更改她的名字並添加其他邏輯。
組織得很好,組織得很好。
在我的精彩觀察之後,讓我們繼續我們真正感興趣的部分:組織整個事情。
人生的一個諷刺是,在整理文件之前,我們必須先整理一下下一步的想法。
我們的下一個功能基本上需要:
讓我們來了解這段程式碼的每個部分的作用:
mkdir organizador cd organizador
為目錄結構中找到的每個檔案或資料夾呼叫organizeFiles函數。它檢查根據副檔名組織每個檔案的條件,建立子資料夾並在必要時移動檔案。
touch organizador.go go mod init organizador.go
這裡,organizeFiles 函數採用三個參數:
先檢查存取檔案/目錄時是否出現錯誤。如果是,則立即返回。
~/organizador . ├── go.mod └── organizador.go
此片段進行兩項檢查:
如果滿足兩個條件,則檔案將顯示為 fmt.Println。
package main import ( "fmt" "os" ) // Defina o deretório o qual você quer organizar como variável global var dirOrigem string := "/Users/User/Downloads" // Troque o diretório func main() { // Verificar se o diretório existe, caso contrário, retornar erro if _, err := os.Stat(dirOrigem); os.IsNotExist(err) { fmt.Println("BAD DIR :( \nDiretório não encontrado: ", dirOrigem) return } else { // Imprimir mensagem caso o diretório exista fmt.Println("GOOD DIR :) \nDiretório encontrado: ", dirOrigem) } }
這裡:
func main() { // Restante do código . . . // Percorrer e listar os arquivos no diretório dirOrigem err := filepath.Walk(dirOrigem, listarArquivos) if err != nil { fmt.Println("Erro ao percorrer o diretório: ", err) } }
這裡,函數:
mkdir organizador cd organizador
此時,destinationPath 代表檔案將被移動的最終路徑。它是使用 filepath.Join 建構的,用於將子資料夾路徑連接到檔案名稱。
touch organizador.go go mod init organizador.go
功能:
使用 filepath.Walk(dirOrigem, OrganizeFiles) 將此函數傳遞給目錄中的每個文件,使它們全部自動組織。
這段程式碼非常適合作為文件組織函數,因為它在單一函數中處理創建和移動邏輯 - 一種高效且有組織的結構形式。
回購:https://github.com/ionnss/organizador
***地球上的另一天,
離子
以上是在 GO 整理您的下載的詳細內容。更多資訊請關注PHP中文網其他相關文章!