技术文摘
Go面试难题:for range循环中map的所有v.name为何都变成了博客
Go面试难题:for range循环中map的所有v.name为何都变成了博客
在Go语言的面试中,常常会出现一些看似简单,实则暗藏玄机的问题,其中一个典型就是“for range循环中map的所有v.name为何都变成了博客”。这个问题不仅考验对for range语法的理解,更涉及到Go语言内存管理和数据结构的底层知识。
我们先来看一段示例代码:
package main
import (
"fmt"
)
type Item struct {
name string
}
func main() {
items := make(map[int]Item)
items[1] = Item{"文章"}
items[2] = Item{"教程"}
for _, v := range items {
v.name = "博客"
}
for _, v := range items {
fmt.Println(v.name)
}
}
按照常理,我们可能预期输出是“文章”和“教程”,但实际输出却都是“博客”。这是为什么呢?
原因在于for range遍历map时,每次迭代返回的v是map元素的副本,而非元素本身。在v.name = "博客"这一行代码中,修改的是副本的name字段,而不是map中原始元素的name字段。
当循环结束后,所有副本的name都被改成了“博客”,但map中的原始元素并未改变。然而,第二次遍历map时,虽然我们遍历的是原始元素,但由于副本在内存中的生命周期和作用域问题,导致看起来所有的name都变成了“博客”。
要解决这个问题,有几种方法。一种是直接通过map的键来修改值,例如:
for k := range items {
items[k].name = "博客"
}
这样就直接修改了map中的原始元素,而不是副本。
在Go面试中遇到这类问题,关键在于深入理解for range循环机制以及map数据结构的特性。通过清晰地认识到副本的存在以及内存管理的原理,我们就能轻松应对这类看似棘手的难题,在面试中展现出对Go语言的深入掌握。
TAGS: Map数据结构 Go面试 for range循环 变量赋值问题
- Android游戏开发入门实例
- Quartz助力开发企业级任务调度应用
- CSS position属性的讨论
- Android游戏开发里游戏触摸轨迹曲线图的绘制
- Android游戏开发(三):View类用法详细解析
- Android游戏开发(一):长按事件原理
- Android游戏开发(二):View类与SurfaceView类
- Android游戏开发第四篇:Canvas与Paint应用实例
- 51CTO《开发月刊》2013年5月刊电子杂志发布
- Android游戏开发(五):Path路径类与Typeface字体类
- Android游戏开发(六):自定义View详细解析
- Android游戏开发第七篇:自定义SurfaceView
- Android游戏开发第八讲:SurfaceView类应用实例
- 程序员不爱读书,而你该读
- IT人防过劳死攻略,教你成为时间主人