Golang面试必备

338 阅读3分钟

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 协成调度模型

 详细介绍