面试题答案
一键面试- 对于简单
map
传递与修改:- 当在主函数中定义
m := make(map[string]interface{})
并传递给modifyMap
函数时,在modifyMap
函数内对map
的修改会反映到主函数中的map
上。 - 原因是在Go语言中,
map
是引用类型。当将map
作为参数传递给函数时,传递的是指向底层数据结构的指针。所以,函数内对map
的修改,实际上是通过这个指针操作底层数据,主函数中的map
也指向同样的底层数据,因此能看到修改。
- 当在主函数中定义
- 对于
map
中嵌套自定义结构体的修改:- 如果
map
中嵌套了自定义结构体,且在modifyMap
函数内修改该结构体字段,主函数中的map
会反映这些变化。 - 假设
map
的值类型是自定义结构体指针*MyStruct
,例如m := make(map[string]*MyStruct)
。在函数内通过指针可以直接修改结构体的字段,因为传递的是指针,主函数中的map
指向相同的结构体实例,所以能看到修改。 - 若
map
的值类型是自定义结构体MyStruct
,例如m := make(map[string]MyStruct)
。在函数内对结构体字段的修改不会反映到主函数的map
中。这是因为Go语言中结构体是值类型,当传递结构体给函数时,会进行值拷贝。函数内修改的是拷贝后的结构体,原结构体不受影响。
- 如果
- 底层机制:
map
的底层实现:Go语言的map
是基于哈希表实现的。当创建一个map
时,会分配一定的内存空间用于存储键值对。map
内部有一个哈希表结构,通过哈希函数将键映射到哈希表的某个位置。当传递map
时,传递的是指向这个哈希表结构的指针。- 结构体的传递:对于值类型的结构体,传递时会进行值拷贝,函数内操作的是拷贝后的副本。而对于指针类型的结构体,传递的是指针,函数内通过指针操作的是同一个结构体实例。所以,在处理复杂类型传递和修改时,要注意类型是值类型还是引用类型,这决定了修改是否会影响到原始数据。