go有哪些数据类型
简单类型:int int32 int64 string bool
引用类型:map slice channel function
复合类型:struct,struct可比较必须每个字段都可以比较大小
还有interface类型
new和make的区别
new返回的是指针,可以用于任何类型,make定义了类型并且初始化了,只用于slice、map、channel类型
切片和数组有什么区别
数组是定长的,不能更改,切片是一个结构体,其中包含了指向底层数组的指针,还要len和cap
切片扩容机制
当添加的元素超过容量的时候,切片会扩容,会开辟一块新的空间,然后把原来的值复制过去,当容量小于1024的时候,会成倍的扩容,大于1024的时候会是之前的1.25倍来扩容,但是因为有内存对齐,所以会稍大一点
map是线程安全的吗
map的源码看过吗,是如何实现的
sync.Map是如何实现的,和map对比
map中的key为什么是无序的
map扩容过程
函数和方法的区别
方法接受者值和指针的区别
哪些情况会panic,panic怎么恢复
什么是CSP
MPG调度模型
G就是goroutine,M代表一个工作线程,P表示处理器,保存着goroutine执行的上下文,还有维护g的本地队列等等,最开始的时候go是MG模型,但是都是从全局队列拿g,会加锁,这样当并发量大的时候性能会变差,所以加了P
每个M都绑定了一个P,P上维护 g的本地队列,M跟CPU的核数相关,P只有跟M绑定后才会处理G,当本地的处理完之后,有次面试问到 是先从全局队列里拿还是去别的P里拿,其实想想讲道理应该是先拿全局的,应为全局的没人处理,根据《Golang修养之路》中所说,确实是这样:
全局队列已经没有G,那m就要执行work stealing(偷取):从其他有G的P哪里偷取一半G过来,放到自己的P本地队列。P2从P1的本地队列尾部取一半的G,本例中一半则只有1个G8,放到P2的本地队列并执行。
下边这个文章可以多次看看:Golang-Scheduler原理解析_惜暮的博客-CSDN博客_scheduler原理
goroutine什么时候会调度
channel源码
channel有哪些应用
如何关闭channel
channel为什么会引起资源泄露
接口类型的定义
interface底层原理
什么是反射
反射的应用
go是如何实现反射的
go中的mutex原理
什么是单例模式,go怎么实现单例
sync.Once源码
暂时先这些,答案会一点点补充上,或者后续面试遇到问题也会补充