Durchlaufen Sie Dateien und Ordner rekursiv in Go - Kann nicht verstehen, wie die Rekursion abläuft
Beispiel 1. (Ich kann die Rekursion in diesem Code verstehen, die Funktion findFactorial
wird im Inneren aufgerufen.)
package main
import "fmt"
var repeated = 0
func main() {
fmt.Println("Answer :",findFactorial(3))
}
func findFactorial(x int) int {
repeated ++
fmt.Printf("Repeating.., Now repeated %v times\n",repeated)
if x == 0 {
return 1
}
return x * findFactorial(x-1) // it is evident that this same function is calling again
}
Ausgabe
go run .\factorial.go
Repeating.., Now repeated 1 times
Repeating.., Now repeated 2 times
Repeating.., Now repeated 3 times
Repeating.., Now repeated 4 times
Answer : 6
Beispiel 2. (Hier kann ich nicht verstehen, wie die Rekursion abläuft)
package main
import (
"fmt"
"log"
"os"
"path/filepath"
)
var repeated = 0
func main() {
iterate("../../../../TEMP")
}
func iterate(path string) {
fmt.Println("path",path)
filepath.Walk(path, func(x string, info os.FileInfo, err error) error {
repeated ++
fmt.Printf("Repeating.., Now repeated %v times\n",repeated)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf("File Name: %s\n", info.Name())
return nil
})
}
Ausgabe
go run .\filepathwalktu.go
path ../../../../TEMP
Repeating.., Now repeated 1 times
File Name: TEMP
Repeating.., Now repeated 2 times
File Name: PNR.png
Repeating.., Now repeated 3 times
File Name: tkt.png
Repeating.., Now repeated 4 times
File Name: understand this.txt
Das zweite Beispiel ist keine Rekursion (zumindest aus Benutzersicht). Sie verwenden nur eine API mit einem Rückruf. filepath.Walk
ist eine Standardbibliotheksfunktion, die eine Funktion als Argument verwendet. In diesem Beispiel ist der Rückruf ein Abschluss oder eine anonym definierte Funktion. Dieser Rückruf wird aufgerufen, wenn filepath.Walk
ein neuer Dateisystemeintrag gefunden wird. Intern filepath.Walk
kann als Rekursion implementiert werden oder nicht.
Nur für den Fall, dass hier ein Beispiel für die Verwendung der Funktion als Argument ist, das nichts mit einer Rekursion zu tun hat:
func foo(cb func(int)) {
// cb is a function that passed as an argument
// it is called 3 times without any recursion
cb(0)
cb(1)
cb(2)
}
func main() {
foo(func(i int) {
fmt.Println("hello,", i)
})
}