Durchlaufen Sie Dateien und Ordner rekursiv in Go - Kann nicht verstehen, wie die Rekursion abläuft


Arun:

Beispiel 1. (Ich kann die Rekursion in diesem Code verstehen, die Funktion findFactorialwird 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
Maxim Kosov:

Das zweite Beispiel ist keine Rekursion (zumindest aus Benutzersicht). Sie verwenden nur eine API mit einem Rückruf. filepath.Walkist 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.Walkein neuer Dateisystemeintrag gefunden wird. Intern filepath.Walkkann 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)
    })
}

Verwandte Artikel


Verstehen Sie, wie Sie .go-Dateien im pkg-Ordner ablegen müssen?

oben: Es kommt sehr oft vor, dass .go-Dateien in den pkg-Ordner übertragen werden, wie hier https://github.com/kubernetes/apiser . goofle: Bitte klären Sie weiter. In dem pkgOrdner auf dem Repo, den Sie verlinkt haben, werden die von ihnen geschriebenen Pakete