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
*/