go1.7 for--range遍历的那些小坑
2021-12-12 本文已影响0人
秸秆混凝烧结工程师
package main
import "fmt"
// for ...range 遍历的的小坑
// 这里的想法就是给M赋值 预计输出
/*
0 ===> 0
1 ===> 1
2 ===> 2
3 ===> 3
但是实际输出的是
0 ===> 0
1 ===> 1
2 ===> 2
3 ===> 3
那么这是为什么?
原因在于每次拷贝的都是一个元素的副本,然后遍历的value都是对同一个同一个元素的遍历赋值,
如果直接对VALUE 取地址将会拿到同一个地址,对应的值就是最后遍历的元素值赋值给Value
可以看一下 for循环原码
/
"""
func main() {
slice := []int{0, 1, 2, 3}
m := make(map[int]int)
// 方法一 : 可以保存一些前一个元素值
for key, val := range slice {
//val := val 局部val替代val
m[key] = &val
fmt.Println(m)
}
for key, _ := range slice {
//方法2 : 直接索引获取原来的值
m[key] = &slice[key]
}
for k, v := range m {
fmt.Println(k, "===>", *v)
}
}
"""
/* 输出
0 ===> 3
1 ===> 3
2 ===> 3
3 ===> 3
*/