进阶版golang面试题

1,138 阅读2分钟

最近面试golang岗位, 顺便差缺补漏, 把golang的面试题整理一下。 这里就不写答案了, 如果有不清楚可以自己网上搜索资料加深记忆

1. 进程、线程、协程的区别
2. 简述golang的GMP调度模型
3. M是工作在内核态还是用户态

这里提一嘴,有面试官喜欢挖坑, 他会这么问你。 这里需要了解什么是用户态什么是内核态。 本质上M是一个抽象出来的概念,用来进行G和线程的绑定(多线程模型M:N) golang在runtime上会做一些处理工作。 发生了系统调用就会进入内核态。 建立线程也需要进行系统调用进入内核态。底层的线程调度是操作系统去处理的。

4. GMP为什么会有 1/61的概率要去全局队列去获取G
5. Go什么时候发生阻塞?阻塞时,调度器会怎么做
6. golang内存分配机制
7. golang的垃圾回收机制。STW时机,什么是写屏障,为什么需要有写屏障
8. golang逃逸分析是什么, 如何查看
9. golang手写并发度控制代码
10. golang 两(三)线程交替打印0-100
11. golang Dojob() 内有个Job()方法, Job超时提前返回
12. 实现一个简单的协程池
13. defer是什么, defer和return的执行先后, 返回值有参,返回值无参defer是否影响返回值
14. 这段代码会输出什么, 为什么
func test(){
   ch := make(chan int, 0)
   go fmt.Println(ch)
   ch<-1
}
15. slice的底层实现原理,扩容机制
16. 什么是死锁,死锁产生的必要条件
17. channel有缓冲区无缓冲区区别
18. array和slice的区别
19. golang哪些类型是并发安全的
20. golang哪些类型是可比较的
21. golang map底层实现
22. golang mutext底层实现
23. golang chan底层实现
24. 标准库的使用:net、http、context、reflect等

其他golang考察点也欢迎做出补充