Closures
Um closure é um valor de function que referencia variáveis de fora do seu próprio corpo. makeMultiplier retorna uma nova function toda vez que é chamada, e cada function retornada lembra do seu próprio factor, capturado no momento em que foi criada.
main.go
Teste você mesmo →package main
import "fmt"
func makeMultiplier(factor int) func(int) int {
return func(n int) int {
return n * factor
}
}
func main() {
double := makeMultiplier(2)
triple := makeMultiplier(3)
fmt.Println(double(5))
fmt.Println(triple(5))
}Output
10 15
Closures podem guardar estado mutável
Um closure não apenas lê as variáveis capturadas — ele também pode modificá-las, e essa modificação persiste entre chamadas. A variável count de makeCounter continua viva dentro do closure retornado, incrementando toda vez que next() é chamado.
main.go
Teste você mesmo →package main
import "fmt"
func makeCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
next := makeCounter()
fmt.Println(next())
fmt.Println(next())
fmt.Println(next())
}Output
1 2 3
A seguir: goroutines — o primitivo de concorrência leve e integrado do Go.
Practice exercise
Escreva uma function makeAdder(x int) func(int) int que retorne um closure que soma x ao seu argumento. Crie addFive := makeAdder(5), depois imprima addFive(10).