I was hitting an issue in a project I\'m working on. I found a way around it, but I wasn\'t sure why my solution worked. I\'m hoping that someone more experience with how
In your first (non working) example item
is the loop variable. Its address is not changing, only its value. That's why you get the same address in output idx
times.
Run this code to see the mechanics in action;
func main() {
coll := []int{5, 10, 15}
for i, v := range coll {
fmt.Printf("This one is always the same; %v\n", &v)
fmt.Println("This one is 4 bytes larger each iteration; %v\n", &coll[i])
}
}
There is just one item
variable for the entire loop, which is assigned the corresponding value during each iteration of the loop. You do not get a new item
variable in each iteration. So you are just repeatedly taking the address of the same variable, which will of course be the same.
On the other hand, if you declared a local variable inside the loop, it will be a new variable in each iteration, and the addresses will be different:
for idx, item := range *coll {
temp := item
output[idx] = &temp
}