Edycja: Jeśli nie było jasne, o co pytałem: jakie problemy można złagodzić, nie zezwalając na zagnieżdżone deklaracje funkcji?
Lambdy działają zgodnie z oczekiwaniami:
func main() {
inc := func(x int) int { return x+1; }
}
Jednak następująca deklaracja w deklaracji nie jest dozwolona:
func main() {
func inc(x int) int { return x+1; }
}
Z jakiego powodu funkcje zagnieżdżone są niedozwolone?
function
go
declaration
corazza
źródło
źródło
func main() { func (x int) int { return x+1; }(3) }
inc()
drugi przykład przed faktyczną deklaracją. Ale! Szukam powodów, niewiele wiem o Go, ale chciałbym się dowiedzieć, jaka była logika tej zasady.Odpowiedzi:
Myślę, że są 3 powody, dla których ta oczywista funkcja jest niedozwolona
To tylko moje opinie - nie widziałem oficjalnego oświadczenia projektantów języka.
źródło
Jasne, że tak. Wystarczy przypisać je do zmiennej:
func main() { inc := func(x int) int { return x+1; } }
źródło
Co uzasadniałoby złożoność i koszt dodawania funkcji zagnieżdżonych? Co chcesz zrobić, czego nie możesz zrobić bez funkcji zagnieżdżonych? I tak dalej.
źródło
Oto sposób implementacji zagnieżdżonych funkcji i funkcji w zagnieżdżonych funkcjach
package main import "fmt" func main() { nested := func() { fmt.Println("I am nested") deeplyNested := func() { fmt.Println("I am deeply nested") } deeplyNested() } nested() }
źródło
nested
środkadeeplyNested
;)Zagnieżdżone funkcje są dozwolone w Go. Wystarczy przypisać je do zmiennych lokalnych w funkcji zewnętrznej i wywołać je przy użyciu tych zmiennych.
Przykład:
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")
Funkcje wewnętrzne są często przydatne w przypadku lokalnych gorutyn:
func outerFunction(...) { innerFunction := func(...) { ... } go innerFunction(...) }
źródło
Musisz tylko natychmiast to wywołać, dodając
()
na końcu.func main() { func inc(x int) int { return x+1; }() }
Edycja: nie może mieć nazwy funkcji ... więc jest to tylko funkcja lambda, która jest wywoływana od razu:
func main() { func(x int) int { return x+1; }() }
źródło