Dlaczego nie można zdefiniować funkcji rekursywnej jako zmiennej? Wydaje mi się, że potrafię definiować dowolne funkcje, z wyjątkiem przypadków, gdy się powtarzają.Funkcja i funkcja zmiennych funkcji gambang
Jest to prawna:
func f(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
func main() {
fmt.Println(f(2))
}
To jest nielegalne:
var f func(int) int = func(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
func main() {
fmt.Println(f(2))
}
To jest legalne i zgaduję, że to tylko dlatego, że można dowiedzieć się, f po inicjalizacji:
func main() {
var f *func(int) int;
t := func(i int) int {
if i == 0 {
return 1
}
return i * (*f)(i-1)
}
f = &t
fmt.Println((*f)(2))
}
Wygląda więc na to, że sprowadza się do funkcji, a deklaracje zmiennych typu funkcji są traktowane jako różne. ale z lektury dokumentacji nie spodziewałbym się, że tak będzie. Czy brakowało mi części dokumentacji opisującej to?
Oczekuję, że nielegalna sprawa zadziała, ponieważ działa w innych językach. Podobnie jak w JavaScript:
(function() {
var f = function (i) {
if (i == 0) {
return 1;
}
return i * f(i - 1);
};
console.log(f(2));
})();
Go nie Javascript. Javascript sprawdza twój kod i mówi "że wygląda dobrze, nie wiem co to jest" f ", ale prawdopodobnie do czasu, kiedy ten blok zostanie wywołany", a następnie przypisze funkcję do zmiennej 'f', i Wszystko jest dobrze. Go chce wiedzieć, co 'f' jest pierwsze, zanim napotka kod, który go wywołuje. –
To właśnie się dzieje, ale tak naprawdę nie wyjaśnia dlaczego. Go nie chce wiedzieć, co 'f' jest, jeśli' f' jest zadeklarowane jako funkcja, ale Go chce wiedzieć, czy 'f' jest zadeklarowane jako zmienna typu funkcji. To jest dziwne. –