这是一个出于完全共享目的的文章,他将收集来自各厂的常见面试题。
如果你有自己在工作、面试中遇到的坑,可以私聊或者评论。
channel什么时候引起资源泄漏
goroutine 操作 channel 后,处于发送或接收阻塞状态,而 channel 处于满或空的状态,一直得不到改变。同时,垃圾回收器也不会回收此类资源,进而导致 gouroutine 会一直处于等待队列中。 另外,程序运行过程中,对于一个 channel,如果没有任何 goroutine 引用了,gc 会对其进行回收操作,不会引起内存泄漏。
make和new的区别
相同:如果一个函数结束之后外部没有引用,那么优先分配到栈中(如果申请的内存过大,栈区存不下,会分配到堆)。如果一个函数结束之后外部还有引用,那么必定分配到堆中
不同:make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。make返回的是引用类型本身;而new返回的是指向类型的指针。
协程有什么优点
- 占用内存小,初始为2kb
- 调度灵活,Go实现的调度器是用户级别
- 抢占式调度,基于编译器插入的抢占指令在函数调用时触发
- 基于信号的异步抢占,定时(20ms)或者GC时触发,解决占用资源无法挂起的任务
Go指针和unsafe.Pointer有什么区别
- Go的指针不能进行数学运算
- Go的指针不同类型的指针不能相互转换
- Go的指不同类型的指针不能使用 == 或 != 比较
- Go的指不同类型的指针变量不能相互赋值
以上内容来自网友提供,更多内容欢迎投稿