range是go语言中常用的循环关键字 约等于java中的foreach
package main
import "fmt"
func main() {
slice := []int{0, 1, 2, 3}
m := make(map[int]*int)
//这里使用range遍历
for key, val := range slice {
m[key] = &v
}
for k, v := range m {
fmt.Println(k, "->", v)
}
}
猜猜最后打印的结果是什么?
0 -> 3
1 -> 3
2 -> 3
3 -> 3
为什么都是3?
因为for range 循环的时候会创建一个变量 val , 然后将数组中每一个变量的值依次赋值到这个val上,我们在range里将val的指针放到map里,每次都放得是同一个指针,所以最后打印出来的是最后一次赋到上面的值,也就是3
所以 m[key] = &val 取的都是变量 val 的地址
正确的写法是
func main() {
slice := []int{0, 1, 2, 3}
m := make(map[int]*int)
for key, val := range slice {
v := val
m[key] = &v
}
for k, v := range m {
fmt.Println(k, "->", *v)
}
}
//结果
/**
3 -> 3
0 -> 0
1 -> 1
2 -> 2
*/
本文解析了Go语言中range关键字在遍历切片和映射map时的常见误区,重点讲解了为何使用range时会导致所有元素指向同一值。正确的方法是复制每个值再进行存储。通过实例演示了如何避免这种问题并得到了预期结果。
1527

被折叠的 条评论
为什么被折叠?



