Um erro comum quando percorremos e alteramos valores de um slice num for é desconsiderar o fato que a variável dentro do for é local e por isso não altera seu valor após o for.
Vamos aos exemplos.
s := []int{1, 2, 3}
for i, n := range s {
n += 1
fmt.Println("Valor de n", i, "dentro do for:", n)
fmt.Println("Valor da posição", i, "dentro do for:", s[i])
fmt.Println()
}
fmt.Println("Valor do slice após o for:", s)
Output
Valor da posição 0 dentro do for: 2
Valor da posição 1 dentro do for: 3
Valor da posição 2 dentro do for: 4
Valor do slice após o for: [1 2 3]
Executando essa função, percorremos o slice e alteramos o valor de cada posição do slice.
Dentro do for o valor de n é alterado, mas é uma variável local e seu valor é desconsiderado na composição do slice ao sair do for.
s := []int{1, 2, 3}
for i, n := range s {
s[i] += 1
fmt.Println("Valor de n", i, "dentro do for:", n)
fmt.Println("Valor da posição", i, "dentro do for:", s[i])
fmt.Println()
}
fmt.Println("Valor do slice após o for:", s)
Output
Valor de n 0 dentro do for: 1
Valor da posição 0 dentro do for: 2
Valor de n 1 dentro do for: 2
Valor da posição 1 dentro do for: 3
Valor de n 2 dentro do for: 3
Valor da posição 2 dentro do for: 4
Valor do slice após o for: [2 3 4]
No exemplo acima, atribuimos os valores da soma em cada posição do slice. Dessa forma, registramos os novos valores e temos como resultado final o valor esperado.
Referências
https://yourbasic.org/golang/gotcha-change-value-range/