得物一面
前言:面试官人太好了,大大的点个赞
自我介绍
make和new的区别,分配的变量类型有啥区别
- 返回类型:new 返回指向给定类型的指针;make 返回一个已经初始化的对象,而不是指针
- 适用范围:new 可以用于任何类型;make 主要用于初始化切片、映射和通道等复合数据类型
- 初始化:new 分配的内存包含的是类型 T 的零值,但返回的是指向这个零值的指针;make 不仅分配内存,还会对切片、映射和通道进行适当的初始化,使其准备好使用
- 使用场景:当你需要一个指向类型 T 的指针时,使用 new;当你需要初始化一个切片、映射或通道时,使用 make
数组和切片的区别
- 数组 是固定大小的,适合存储固定数量的元素;它是值类型,复制时会复制所有元素。
- 切片 是动态大小的,更适合存储不确定数量的元素;它是引用类型,赋值时传递的是引用而不是整个数据。
介绍一下defer
确保资源的释放、文件关闭、解锁等操作能够在函数退出时得到执行
- 延迟执行:defer 声明的函数会在函数即将返回时执行,即使函数中有提前返回或者==panic==的情况
- 后进先出(LIFO):多个 defer 声明按照它们被声明的逆序执行,类似于栈的 LIFO 原则
- 捕获当前状态:defer 声明的函数会捕获当前的函数调用状态,包括所有局部变量的当前值
介绍一下map,怎么线程安全,底层原理,删除一个key内存会有变化吗
介绍
- 无序:map 中的元素是没有顺序的,因此遍历时顺序不可预测。
- 动态大小:map 的大小可以根据需要动态增加或减少。
内部结构
- 桶表(bucket table):一个哈希表,用于存储键值对。
- 哈希函数:用于计算键的哈希值,以定位桶的位置。
- 链表:每个桶内部可以包含一个链表,用于解决哈希冲突
- 扩容机制:当
map
的元素数量接近桶的数量时,Go 语言会自动扩容map
,以保持高效的性能 - 哈希冲突:每个桶内部都有一个链表,用于存储具有相同哈希值的键值对
线程安全
- sync.Mutex
- sync.Map{}
删除一个key内存会有变化吗
如何是int类型不会有变化,但是如果是指针或者引用就会有影响,同时桶的大小不会被影响
chan的介绍和底层原理
- chan 的特点:类型化、同步、阻塞和缓冲。
- 底层实现:chan 包括一个队列、互斥锁以及发送者和接收者的等待队列。
- 工作流程:发送和接收操作通过互斥锁协调,确保数据的安全传输。
- 缓冲通道:通过队列暂存数据,提高并发性能。