Helo, ion di sini lagi.
Ketakutan untuk mempelajari sesuatu yang akan dicapai oleh AI suatu hari nanti membuatkan saya benar-benar tertekan. Tetapi, jika "menyelesaikan masalah" masih menjadi keperluan yang dikenakan kepada manusia pada masa hadapan, mengapa tidak berterusan?
Kali ini saya bawakan tutorial lagi. Kurang berguna daripada yang pertama. Jadi mari kita tentukan struktur "masalah", kerana kita sudah tahu satu perkara: mereka yang tidak mempunyai masalah, itu kerana mereka tidak kelihatan cukup. Dan bagi mereka yang belum menemuinya, tinggal masa sahaja sebelum mereka boleh menciptanya.
Struktur program yang paling mudah ialah:
Buat direktori dan navigasi ke dalamnya:
mkdir organizador cd organizador
Buat fail organizer.go dan mulakan modulnya:
touch organizador.go go mod init organizador.go
Anda sepatutnya mempunyai sesuatu yang lebih kurang seperti ini:
~/organizador . ├── go.mod └── organizador.go
Mari kita takrifkan directorydirOrigem sumber di mana kita akan melaksanakan organisasi. Dengan ditakrifkan, mari semak sama ada ia benar-benar wujud, jika tidak, kami akan mengembalikan ralat:
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) } }
Sekarang, mari kita buat beberapa pertimbangan tentang kod di atas:
Adakah anda perasan bahawa di sini kita akan pergi sedikit demi sedikit dan menikmati bit dan bait bunyi papan kekunci mekanikal. _Tchaka tchaka boom! _
Dan sekarang kita akan mencipta fungsi panggil balik. Sesuatu yang sebenarnya saya tidak pernah pelajari atau tidak pernah cukup ingin tahu untuk mempersoalkan sama ada saya pernah menggunakan konsep ini dalam mana-mana kod Python dalam kehidupan pra-golang saya.
Fungsi panggil balik ialah fungsi yang dihantar dengan argumen kepada fungsi lain.
Jika anda sudah biasa dengan konsepnya, tahniah, jika tidak, tahniah. Dalam erti kata lain, tahniah!
Sekarang mari buat failpath.Walk fungsi panggil balik yang akan dihantar sebagai hujah kepada fungsi lain.
mkdir organizador cd organizador
touch organizador.go go mod init organizador.go
Tetapi tunggu, bagaimana failpath.Walk memanggil Fungsi Panggilan Balik?
Apabila anda memanggil filepath.Walk(sourcedir, listFiles), fungsi filepath.Walk melakukan tugas berat berjalan melalui semua fail dan subdirektori dalam sourcedir.
Untuk setiap fail atau direktori yang ditemui, ia memanggil fungsi listFiles dengan tiga argumen:
Go secara automatik memahami bahawa listFiles mesti menerima tiga parameter ini kerana filepath.Walk menjangkakan fungsi yang mengikuti tandatangan ini dengan tepat:
~/organizador . ├── go.mod └── organizador.go
Perhatikan bahawa fungsi Walk mengembalikan ralat! Ini relevan!
Itulah sebabnya kami menyamakan laluan fail fungsi kami.Walk(dirOrigem,listarArquivos) dengan ralat:
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) } }
Lagipun, kerana ia mengembalikan ralat, ia adalah ralat XD
Berikut ialah pandangan yang lebih terperinci tentang perkara yang berlaku pada setiap langkah:
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) } }
Untuk setiap fail atau direktori dalam dirOrigem, filepath.Walk akan memanggil listFiles seolah-olah seperti ini:
// 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 }
Dalam contoh ini, untuk setiap panggilan:
listFiles ialah fungsi panggil balik yang laluan fail.Walk memanggil secara automatik dengan nilai ini. Dengan cara ini, kita tidak perlu risau tentang menetapkan laluan, maklumat dan nilai ralat; filepath.Walk sudah melakukan ini untuk kita.
PHE!
Sekarang lakukan ujian nakal itu pada terminal anda:
// Função Walk() func Walk(root string, walkFn WalkFunc) error // Tipo WalkFunc type WalkFunc func(path string, info os.FileInfo, err error) error
Anda boleh mendapatkan hasilnya:
err := filepath.Walk(dirOrgiem, listarArquivos)
Atau:
//Percorrer e listar os arquivos no diretório err := filepath.Walk(dirOrigem, listarArquivos)
Dalam kes ini, saya hanya meletakkan "s" tambahan dalam "Muat Turun" supaya dir Asal tidak betul.
Sekarang padamkan fungsi listFiles, kerana kami tidak akan menggunakannya.
Bergurau sahaja, kami hanya akan menukar namanya dan menambah logik lain.
Tersusun itu bagus, mengatur itu hebat.
Selepas pemerhatian cemerlang saya ini, mari kita beralih ke bahagian yang benar-benar menarik minat kita: mengatur semuanya.
Sebagai ironi dalam kehidupan, sebelum menyusun fail, kita perlu menyusun idea untuk langkah seterusnya.
Fungsi seterusnya kami pada asasnya memerlukan:
Mari kita fahami apa yang dilakukan oleh setiap bahagian kod ini:
mkdir organizador cd organizador
Fungsi organizeFiles dipanggil untuk setiap fail atau folder yang terdapat dalam struktur direktori. Ia menyemak syarat untuk menyusun setiap fail berdasarkan sambungannya, mencipta subfolder dan memindahkan fail jika perlu.
touch organizador.go go mod init organizador.go
Di sini, fungsi organizeFiles mengambil tiga parameter:
Semakan pertama ialah sama ada terdapat ralat semasa mengakses fail/direktori. Jika ya, ia dikembalikan serta-merta.
~/organizador . ├── go.mod └── organizador.go
Coretan ini membuat dua semakan:
Jika kedua-dua syarat dipenuhi, fail dipaparkan dengan 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) } }
Di sini:
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) } }
Di sini, fungsinya:
mkdir organizador cd organizador
Pada ketika ini, destinationPath mewakili laluan terakhir di mana fail akan dialihkan. Ia dibina menggunakan failpath.Join, untuk menyertai laluan subfolder ke nama fail.
touch organizador.go go mod init organizador.go
Fungsi:
Menggunakan filepath.Walk(dirOrigem, organizeFiles) menghantar fungsi ini kepada setiap fail dalam direktori, menyebabkan mereka semua disusun secara automatik.
Kod ini sesuai dengan fungsi organisasi fail kerana ia mengendalikan penciptaan dan logik pergerakan dalam satu fungsi – bentuk struktur yang cekap dan teratur.
REPO: https://github.com/ionnss/organizador
***Satu hari lagi di bumi,
ion
Atas ialah kandungan terperinci Susun muat turun anda dalam GO. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!