Go 面试每天一篇(第 2 天)
程序员文章站
2022-08-03 20:50:36
下面这段代码输出什么,说明原因。 参考答案: 解析:这是新手常会犯的错误写法,for range 循环的时候会 创建每个元素的副本,而不是元素的引用 ,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值 ......
下面这段代码输出什么,说明原因。
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) } }
所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!