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

上一篇下一篇

猜你喜欢

热点阅读