0
点赞
收藏
分享

微信扫一扫

GO面试题第一天

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

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

注意每次结果不一定一样:

GO面试题第一天_赋值

 以及

GO面试题第一天_赋值_02

 参考解析:

       这是新手常会犯的错误写法,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)
}
}


举报

相关推荐

0 条评论