Go语言Map高频面试题及详细答案(实战版).docxVIP

  • 1
  • 0
  • 约3.29千字
  • 约 5页
  • 2026-10-12 发布于河北
  • 举报

Go语言Map高频面试题及详细答案(实战版).docx

Go语言Map高频面试题及详细答案(实战版)

1.简单说说Go中map的底层结构?

map底层是哈希表,核心结构体是hmap,并不是直接的键值对数组,主要由几部分组成:

第一,count:记录当前map存储的键值对总数,len(map)就是读取这个字段;

第二,B:桶的数量指数,真正桶的数量是2^B,默认初始B=4,也就是16个桶;

第三,buckets:桶数组指针,每个桶是一个bmap结构体,一个桶固定最多存8个键值对;

第四,oldbuckets:扩容时的旧桶数组,扩容期间新旧桶共存,完成迁移后释放;

第五,nevacuate:扩容迁移进度标记,用于渐进式扩容;

第六,overflow:溢出桶指针,当单个桶8个位置存满后,会挂载溢出桶,解决哈希冲突。

整体存储逻辑:通过键的哈希值取余桶数量,定位到对应桶,再在桶内遍历匹配键,完成增删查改。

2.map的键可以是什么类型?为什么切片、结构体不能做键?

map的键必须是可比较类型,也就是支持==、!=判断的类型。

可以做键的类型:字符串、数字、布尔、指针、数组、结构体(所有字段都可比较)、接口类型。

不可以做键的类型:切片、map、函数、包含切片/map的结构体。

核心原因两点:

第一,map查找、去重都依赖键的等值比较,切片是引用类型,只能比较地址,不能比较底层数据,语法层面直接禁止比较;

文档评论(0)

1亿VIP精品文档

相关文档