AnyCompiler

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.

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.

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).