GO-面试考点总结

本文总结了Go语言面试中的核心考点,涵盖Go同步锁、channel特性、new和make的区别、打印函数、数组与切片差异、defer用法、slice底层实现、PHP数据结构、Go的map原理、GMP调度模型、Mutex的正常与饥饿模式、等待组实现、三色标记GC、Zookeeper在Kafka中的应用、Kafka消息不丢失策略、分布式幂等性设置、Zookeeper的使用场景、分布式事务处理、单例模式设计、Go锁设计及注意事项、MySQL两阶段提交、大文件读取、Elasticsearch设计问题、延迟队列实现、秒杀系统设计和分表问题。全面解析Go语言及相关的并发、数据结构、分布式系统知识。
摘要由CSDN通过智能技术生成

1:go同步锁有什么特点,作用是什么?

当一个goroutine获得同步锁时,其他的只能等待。如果该gouroutine释放了读,其他可以读不可以写,但是在写占用时,其他不可读和写。作用是保证资源在使用时的独有性,不会因为并发而导致数据错乱,保证系统的稳定性。

2:go语言中channel有什么特点,需要注意什么,数据结构怎样?

先进先出,分为有缓存和无缓冲

给nil发或者从nil的channel接收都会永久阻塞。给已经关闭的channel发会Panic,从关闭的channel取,如果缓冲区中为空则会返回零值

无缓冲的channel是同步的,有缓存的是非同步的

参考于:百度安全验证https://baijiahao.baidu.com/s?id=1637513659872023994&wfr=spider&for=pc

lock:互斥锁,加锁-》把数据cpoy到队列(获取取出),修改sendx或者recvx的值对应buf的位置-》释放锁

sendq和recvq是双向链表:原因:在send和recv过程中获取当我位置比较方便,一直循环就行。依靠链表自身特性也符合先进先出。

buf:有缓存的才有,环形链表

sendx和recvx:记录buf中发送或者接收的可写的index

 缓存满了存或者没有取就会阻塞goroutine,G1满了会主动调用GO的调度器,让出M给其他G使用,G1会被抽象成含有G1指针和send元素sudog结构体,保存到hchan的sendq中等待被唤醒。这是G2recv数据,channel会将等待队列中的G1推出,将G1send的数据推到缓存中,然后调用GO的schedule唤醒G1,把G1放到可以允许的gouroutine队列中。如果是取的过程阻塞,就是当G1推数据时,不会有锁操作,G1直接copy到G2栈中,减少了内存copy。

3:go的new和make有什么区别?

new : 分配空间,传递给new函数的是一个类型而不是值,返回的是新分配的地址的指针

make:为slice, map 或者chan初始化,返回引用。make函数目的和new不同,用于创建上面三类,返回的是类的实例

4:打印函数?

printf:标准化输出到屏幕,sprintf:格式化输出到字符串中,fsprintf:格式化字符串到文件中

5:数组和切片的区别?

数组的长度是数组类型的一部分,通过值传递

切片:指针,长度,容量三部分组成,地址传递通过数组或者make初始化,存在扩容

6:defer?

程序结束执行,return,panic都会执行,多个最后的先执行。

用于:打开释放锁,打开关闭连接

7:slice的底层实现?

基于数组实现,是底层数组的抽象,底层内存是连续分配的,效率很高,通过索引获取数据,可以迭代和垃圾回收优化。通过指针引用底层数组,切片本身非常小,只有三个字段:指向底层数组的指针,切片长度,切片容量。

切片的扩容策略:

1:新申请的大于2倍的旧容量,选择

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值