TOP

Go 面试每天一篇(第 2 天)
2019-09-04 00:56:08 】 浏览:57
Tags:面试 天一篇

下面这段代码输出什么,说明原因。

func main() {

    slice := []int{0,1,2,3}
    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 {
        value := val
        m[key] = &value
    }

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

所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!


Go 面试每天一篇(第 2 天) https://www.cppentry.com/bencandy.php?fid=78&id=249910

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Golang检测Linux服务器端口占用 下一篇goroutine,channel