Edit: Si ce que je demandais n'était pas clair: quels sont les problèmes qui sont atténués en n'autorisant pas les déclarations de fonctions imbriquées?
Les lambdas fonctionnent comme prévu:
func main() {
inc := func(x int) int { return x+1; }
}
Cependant, la déclaration suivante dans une déclaration n'est pas autorisée:
func main() {
func inc(x int) int { return x+1; }
}
Pour quelle raison les fonctions imbriquées ne sont-elles pas autorisées?
function
go
declaration
corazza
la source
la source
func main() { func (x int) int { return x+1; }(3) }
inc()
le deuxième exemple avant la déclaration réelle. Mais! Je cherche des raisons, je ne connais pas grand chose à Go mais j'aimerais savoir quelle était la logique derrière cette règle.Réponses:
Je pense qu'il y a 3 raisons pour lesquelles cette fonctionnalité évidente n'est pas autorisée
Ce ne sont cependant que mes opinions - je n'ai pas vu de déclaration officielle des concepteurs de langage.
la source
Bien sûr qu'ils le sont. Il vous suffit de les affecter à une variable:
func main() { inc := func(x int) int { return x+1; } }
la source
Qu'est-ce qui justifierait la complexité et le coût de l'ajout de fonctions imbriquées? Que voulez-vous faire que vous ne pouvez pas faire sans fonctions imbriquées? Etc.
la source
Voici un moyen d'implémenter des fonctions imbriquées et des fonctions dans des fonctions imbriquées
package main import "fmt" func main() { nested := func() { fmt.Println("I am nested") deeplyNested := func() { fmt.Println("I am deeply nested") } deeplyNested() } nested() }
la source
nested
à l' intérieurdeeplyNested
;)Les fonctions imbriquées sont autorisées dans Go. Il vous suffit de les affecter à des variables locales dans la fonction externe et de les appeler en utilisant ces variables.
Exemple:
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")
Les fonctions internes sont souvent utiles pour les goroutines locales:
func outerFunction(...) { innerFunction := func(...) { ... } go innerFunction(...) }
la source
Il vous suffit de l'appeler immédiatement en ajoutant
()
à la fin.func main() { func inc(x int) int { return x+1; }() }
Edit: ne peut pas avoir de nom de fonction ... donc c'est juste une fonction lambda qui est appelée tout de suite:
func main() { func(x int) int { return x+1; }() }
la source