Bearbeiten: Wenn nicht klar war, was ich gefragt habe: Welche Probleme werden gemildert, wenn verschachtelte Funktionsdeklarationen nicht zugelassen werden?
Lambdas arbeiten wie erwartet:
func main() {
inc := func(x int) int { return x+1; }
}
Die folgende Erklärung innerhalb einer Erklärung ist jedoch nicht zulässig:
func main() {
func inc(x int) int { return x+1; }
}
Aus welchem Grund sind verschachtelte Funktionen nicht zulässig?
function
go
declaration
Corazza
quelle
quelle
func main() { func (x int) int { return x+1; }(3) }
inc()
das zweite Beispiel vor der eigentlichen Deklaration aufrufen . Aber! Ich suche nach Gründen, ich weiß nicht viel über Go, aber ich würde gerne erfahren, was die Logik hinter dieser Regel war.Antworten:
Ich denke, es gibt drei Gründe, warum diese offensichtliche Funktion nicht erlaubt ist
Dies sind jedoch nur meine Meinungen - ich habe keine offizielle Erklärung der Sprachdesigner gesehen.
quelle
Sicher sind sie. Sie müssen sie nur einer Variablen zuweisen:
func main() { inc := func(x int) int { return x+1; } }
quelle
Was würde die Komplexität und die Kosten des Hinzufügens verschachtelter Funktionen rechtfertigen? Was möchten Sie tun, was Sie ohne verschachtelte Funktionen nicht tun können? Und so weiter.
quelle
Hier ist eine Möglichkeit, verschachtelte Funktionen und Funktionen in verschachtelten Funktionen zu implementieren
package main import "fmt" func main() { nested := func() { fmt.Println("I am nested") deeplyNested := func() { fmt.Println("I am deeply nested") } deeplyNested() } nested() }
quelle
nested
innendeeplyNested
;)Verschachtelte Funktionen sind in Go zulässig. Sie müssen sie nur lokalen Variablen innerhalb der äußeren Funktion zuweisen und sie mit diesen Variablen aufrufen.
Beispiel:
func outerFunction(iterations int, s1, s2 string) int { someState := 0 innerFunction := func(param string) int { // Could have another nested function here! totalLength := 0 // Note that the iterations parameter is available // in the inner function (closure) for i := 0; i < iterations; i++) { totalLength += len(param) } return totalLength } // Now we can call innerFunction() freely someState = innerFunction(s1) someState += innerFunction(s2) return someState } myVar := outerFunction(100, "blah", "meh")
Innere Funktionen sind für lokale Goroutinen oft nützlich:
func outerFunction(...) { innerFunction := func(...) { ... } go innerFunction(...) }
quelle
Sie müssen es nur sofort aufrufen, indem Sie
()
es am Ende hinzufügen .func main() { func inc(x int) int { return x+1; }() }
Bearbeiten: kann keinen Funktionsnamen haben ... es ist also nur eine Lambda-Funktion, die sofort aufgerufen wird:
func main() { func(x int) int { return x+1; }() }
quelle