Golang 常见面试题

  1. GMP调度模型

    G:Go协程

    M:⼯作线程,数量对应于真实的CPU数

    P:处理器,包含运⾏Go代码 的必要资源,⽤来调度G和M之间的关联关系

    M必须拥有P才能执⾏G中的代码,P含有⼀个包含多个G的队列,P可以调度G交由 M执⾏。

    https://juejin.cn/post/6844904130398404616

    GC三⾊标记法:https://juejin.cn/post/7111515970669117447

    初始时所有对象都是⽩⾊

    从gc root对象出发,扫描所有可达对象标记为灰⾊,放⼊待处理队列

    从队列取出⼀个灰⾊对象标记为⿊⾊,将其引⽤标记为灰⾊,放⼊队列

    重复直⾄灰⾊对象队列为空

    剩下所有⽩⾊对象都是垃圾对象

    强三⾊不变性:⿊⾊对象不会指向⽩⾊对象,只会指向灰⾊对象或者⿊⾊对象 弱三 ⾊不变性:⿊⾊对象指向的⽩⾊对象必须包含⼀条从灰⾊对象经由多个⽩⾊对象的 可达路径

    插⼊写屏障:当⼀个对象引⽤另外⼀个对象时,将另外⼀个对象标记为灰⾊,以此 满⾜强三⾊不变性,不会存在⿊⾊对象引⽤⽩⾊对象 删除写屏障:在灰⾊对象删除 对⽩⾊对象的引⽤时,将⽩⾊对象置为灰⾊,其实就是快照保存旧的引⽤关系,满 ⾜弱三⾊不变性

  2. Context用法

    3个基础能力,取消、超时、附加值

  3. Go垃圾回收

    https://blog.csdn.net/Dong_chongwu/article/details/128710443

  4. Go的逃逸分析

    逃逸分析:在函数内部定义了一个局部变量,然后返回这个局部变量的地址(指针)。由于这些局部变量是在栈上分配的(静态内存分配),一旦函数执行完毕,变量占据的内存被销毁,任何对这个返回值的动作(如解引用),都将扰乱程序的运行,甚至导致程序直接崩溃

    https://blog.csdn.net/weixin_39299288/article/details/119772086

  5. channel

  6. go的profile工具

    pprof

  7. 写代码的时候如何减少小对象分配

  8. go实现不重启热部署

  9. go并发机制

  10. go内存操作也要处理IO,是如何处理的

  11. gomap并发安全问题,如何解决

  12. golang:切片和数组、map、gc、gpm调度模型

  13. syncpool的实现原理

  14. channel和锁对比一下

  15. channel的应用场景

  16. 向为nil的channel发送数据会怎么样

  17. map取一个key,然后修改这个值,原map数据的值会不会变化

  18. gostruct能不能比较

  19. context包的用途

  20. slice,len,cap,共享,扩容

  21. map如何顺序读取

  22. go结构体和结构体指针的区别

  23. go深拷贝,什么时候需要深拷贝

  24. 如何拿到多个goroutine的返回值,如何区别他们

  25. go如何避免panic

  26. gochannel实现排序

  27. 读过什么go源码没有

  28. 连接池

  29. go什么场景使用接口

  30. channel和共享内存有什么优劣势

  31. golang用到哪些框架

  32. 你觉得java和golang有什么优势劣势

  33. defer用的多吗?有哪些应用

  34. 异常捕获是如何做的

  35. 如何实现一个线程安全的map

  36. 创建一个数组底层扩容

  37. make一个slice参数怎么写?

  38. 为什么不要大量使用goroutine

  39. go里面goroutine创建数量有限制吗?

    每个协程至少需要消耗 2KB 的空间,那么假设计算机的内存是 2GB,那么至多允许 2GB/2KB = 1M 个协程同时存在。

    协程数能看多少取决于打开协程处理方法所占的CPU和内存,如果只是空的操作,那么理论上内存会首先成为瓶颈,此时2G的内存跑满之后程序会出现错误。如果是CPU密集型的话则可能两三个协程就会让程序出现异常。

    可以通过channel控制goroutine数量

  40. 线程和协程有什么区别

  41. golang支持哪些并发机制

  42. go利用channel通信的方式

  43. 有缓冲和无缓冲channel的区别

  44. channel实现原理

  45. 被close的channel会有什么问题

  46. 分布式锁知道哪些?用channel如何实现?

  47. 集群用channel如何实现分布式锁

  48. 并行goroutine如何实现

  49. go用共享内存的方式实现并发如何保证安全?

  50. go的锁是可重入的吗?

  51. 获取不到锁会一直等待吗?

  52. 那如何实现一个timeout的锁?

  53. go切片是如何实现的

  54. go怎么实现封装继承多态

  55. 为什么go的变量申请类型是为了什么?

Author

Steven Zhu

Posted on

2023-07-08

Updated on

2023-07-08

Licensed under