golang开发笔记No.1

问题:下面这段代码输出

func main() {

    slice := []int{0,1,2,3,4}
    m := make(map[int]*int)

    for key,val := range slice {
        m[key] = &val
    }

    for k,v := range m {
        fmt.Println(k,"->",*v)
    }
}
//结果
0 -> 3
1 -> 3
2 -> 3
3 -> 3

参考解析:这是新手常会犯的错误写法,for range 循环的时候会创建每个元素的副本,而不是元素的引用,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3

正确写法:

func main() {

    slice := []int{0,1,2,3}
    m := make(map[int]*int)

    for key,val := range slice {
    	varlue :=val
        m[key] = &varlue
    }

    for k,v := range m {
        fmt.Println(k,"->",*v)
    }
}

//结果
0 -> 0
1 -> 1
2 -> 2
3 -> 3

猜你喜欢

转载自blog.csdn.net/m0_38004619/article/details/101548112