Sobes.tech
Senior

O que este código irá mostrar e por quê? ```go package main import "fmt" func main() { lst := []string{"a", "b", "c", "d"} for k, v := range lst { if k == 0 { lst = []string{"aa", "bb", "cc", "dd"} } fmt.Println(v) } } ```

sobes.tech IA

Resposta da IA

O código irá mostrar:

a
b
c
d

Por que:

Em Go, quando você usa for k, v := range lst, o slice lst é copiado por referência, mas o iterador funciona sobre o slice original, que existia no momento do início do ciclo. Alterar a variável lst dentro do ciclo não afeta a iteração.

Ou seja, ao entrar no ciclo, lst contém {"a", "b", "c", "d"}, e é sobre esse slice que a iteração ocorre. A reatribuição de lst dentro do ciclo não muda o conjunto de elementos pelos quais se percorre.

Se você quiser que as mudanças no slice afetem o ciclo, deve usar outra abordagem, por exemplo, um ciclo com índices ou reiniciar o ciclo.

Exemplo:

for i := 0; i < len(lst); i++ {
    if i == 0 {
        lst = []string{"aa", "bb", "cc", "dd"}
    }
    fmt.Println(lst[i])
}

Neste caso, a saída será diferente e pode causar pânico se o comprimento mudar.