Avatar ·

Alteração de elementos de um slice durante iteração em Go: por que não funciona e como corrigir?

Olá a todos! Comecei a estudar Go e me deparei com um comportamento estranho ao iterar sobre um slice. Tenho um código simples onde quero dobrar cada elemento em um slice de inteiros: ```go package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} for _, val := range nums { val = val * 2 } fmt.Println(nums) // Esperava: [2, 4, 6, 8, 10], mas obtenho: [1, 2, 3, 4, 5] } ``` Esperava que após o loop os valores no slice fossem alterados, mas eles permaneceram os mesmos. Verifiquei — o compilador não emite erros, o código executa, mas o resultado não é o esperado. Por que isso acontece? Pensei que `val` fosse uma referência ao elemento do slice, mas parece que não é assim. Como alterar corretamente os elementos de um slice durante a iteração? Existem outras formas além de usar o índice? Desde já agradeço pela ajuda! <<>>

Problema: cópia do valor durante a iteração

Em Go, ao usar a construção for range, a variável val é uma cópia de cada elemento do slice, não uma referência. Portanto, alterar val não modifica o slice original. Para modificar os elementos, você deve acessá-los pelo índice:

```go for i := range nums { nums[i] = nums[i] * 2 } ```

Ou, se precisar do valor, use o índice e o valor juntos:

```go for i, val := range nums { nums[i] = val * 2 } ```

Isso garante que você está alterando diretamente o elemento no slice.