Go · Avançado · Português · Técnico
captura de variável de laço
Armadilha em que closures criadas dentro de um for compartilhavam a mesma variável de laço. Desde o Go 1.22, cada iteração tem sua própria cópia.
Onde usar
Em código antigo, goroutines disparadas em um for imprimiam sempre o último valor, e o conserto era copiar com i := i. A nova semântica só vale se o go.mod declarar go 1.22 ou mais.
Em código
// vale com go 1.22+ no go.mod
for i := 0; i < 3; i++ {
go func() {
fmt.Println(i) // cada uma vê seu i
}()
}
time.Sleep(time.Second)Exemplos
Todas as goroutines imprimiram 3 por causa da captura da variável de laço.
Desde o Go 1.22 esse bug de captura de variável de laço não acontece mais.
Cuidado
Não presuma a semântica nova em projetos cujo go.mod ainda declara versão anterior; lá o bug clássico continua.
Sinônimos
captura da variável do for