ExpertiDict

Go · Avançado · Português · Técnico

captura de variável de laço

/kapˈtu.ɾa d͡ʒi vaˈɾja.vew d͡ʒi ˈla.su/substantivo

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

Veja também

Todos os termos de Go