1、select 随机还是 顺序的
随机
* select 中只要有一个case能return,则立刻执行。
* 当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。
* 如果没有一个case能return则可以执行”default”块。
2、Go语言中,局部变量分配堆还是栈
Go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析,当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。
3、Go垃圾回收机制
v1.1 STW
v1.3 Mark STW, Sweep 并行
v1.5 三色标记法
v1.8 hybrid write barrier
1)、何时出发GC
在堆上分配大于 32K byte 对象的时候进行检测此时是否满足垃圾回收条件,如果满 足则进行垃圾回收。
2)、触发条件
触发条件主要关注下面代码中的中间部分:forceTrigger || memstats.heap_live >= memstats.gc_trigger 。forceTrigger 是 forceGC 的标志;后面半句的意思是当前堆上的 活跃对象大于我们初始化时候设置的 GC 触发阈值
3)、主要流程
- 所有对象最开始都是白色。
- 从 root 开始找到所有可达对象,标记为灰色,放入待处理队列。
- 遍历灰色对象队列,将其引用对象标记为灰色放入待处理队列,自身标记为黑色。
- 处理完灰色对象队列,执行清扫工作。
4、协成调度原理
5、runtime机制
6、获取程序运行时的协成数,堆栈信息
7、如何调试go的性能问题
8、make 和new 的区别
9、 go 中 channel 有 缓冲和无缓冲的区别
那就是一个是同步的 一个是非同步的
怎么说?比如
c1:=make(chan int) 无缓冲
c2:=make(chan int,1) 有缓冲
c1<-1
无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着
而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。
打个比喻
无缓冲的 就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。
无缓冲保证信能到你手上
有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。
有缓冲的 保证 信能进你家的邮箱
10、 图解 channel 的实现
11、 GMP 协成调度模型