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.