If you take the address of loop variable, it may cause a bug which all values are same.
You might expect following program prints 5 10 15
but it prints 15 15 15
.
That’s because loop variable v
is initialized just once.
package main import "fmt" func main() { coll := []int{5, 10, 15} for _, v := range toPointers(coll) { fmt.Printf("%v ", *v) } } func toPointers(ints []int) []*int { pointers := make([]*int, len(ints)) for i, v := range ints { pointers[i] = &v // XXX: mistake } return pointers }
You can get expected result if you write like this:
package main import "fmt" func main() { coll := []int{5, 10, 15} for _, v := range toPointers(coll) { fmt.Printf("%v ", *v) } } func toPointers(ints []int) []*int { pointers := make([]*int, len(ints)) for i, _ := range ints { pointers[i] = &ints[i] } return pointers }