问题
package main
import "fmt"
func main() {
values := []int{1, 2, 3}
// 错误的用法:在循环中使用指针引用循环变量
var pointers []*int
for _, v := range values {
pointers = append(pointers, &v)
}
// 输出结果
for _, ptr := range pointers {
fmt.Println(*ptr)
}
}
在这个例子中,我们试图在循环中使用指针引用循环变量 v。但是由于循环变量的地址在每次迭代中都会被重用,因此 pointers 切片中存储的是相同的地址,指向最后一个迭代的 v 的值。因此,最终输出的结果将会是 3,而不是 1、2、3。
解决方法
package main
import "fmt"
func main() {
values := []int{1, 2, 3}
// 正确的用法:在循环中创建局部变量来存储循环变量的值
var pointers []*int
for _, v := range values {
temp := v
pointers = append(pointers, &temp)
}
// 输出结果
for _, ptr := range pointers {
fmt.Println(*ptr)
}
}
在这个修正后的例子中,我们在循环中创建了一个局部变量 temp 来存储循环变量的值,并将其地址添加到 pointers 切片中。这样,每个指针都指向一个独立的值,避免了原始问题的发生。