Go поддържа самоизвикващи се функции1. Тук имаме класически пример.
import "fmt"
Тази функция fact извиква себе си докато достигне
първичния си случай fact(0).
func fact(n int) int {
if n == 0 {
return 1
}
return n * fact(n-1)
}
func main() {
fmt.Println(fact(7))
Безименните функции също могат да се самоизвикват,
но е нужно преди това да обявим променлива с
помощта на var, за да съхраним препратка към вида
на функцията преди да ѝ дадем определение. Така
всъщност я именуваме.
var fib func(n int) int
fib = func(n int) int {
if n < 2 {
return n
}
Понеже fib е обявена предварително в main,
Go знае коя функция, с име fib, да извика
тука.
return fib(n-1) + fib(n-2)
}
fmt.Println(fib(7))
}
$ go run recursion.go
5040
13
Следващ пример: Обход на вградени видове с range.