2024-10-14 10:41:36
爆肝整理的Golang面试题,不对之处望批评指正答案需要加上自己的思考,最好是代码实践下。
1、面试建议
技术部分
1)算法部分,刷LeetCode就完事了,这是一个长期的过程,短期突击没啥效果,因为题目太多了。
2)语言基础,细分为:golang基础及原理,就是本文主要内容了;mysql基础及原理;redis基础及原理;linux常用的命令,比如定时脚本几个参数时间分别代表啥,文件权限需要搞清楚,进程内存占用命令;小公司还要懂一些前端的知识,因为他们希望你什么都会。
建议大家可以去多刷刷Golong题库,题库总结的很到位,而且题目质量也很高,方便巩固语法基础,还可以去看前端面试题库,题目很全还配有答案,可以方便快速的了解前端知识。
3)项目经验,可以搞一个基于gin的后端接口服务的web框架,一般会问你怎么实现的;以及微服务了解一下。
非技术部分
1)HR面也可以完全准备一份可能问到的问题的答案,并不是说你不会回答,而是会让你的表达更顺畅,其次也说明你是有备而来的,我在某拉公司面试就吃了这个亏,技术通过,HR说我的表达能力不行(后续我也会把这个模板分享出来,感谢我媳妇充当面试官,以及指导如何高情商的回答HR的问题)。
2)可以自己录音面试回答,看看自己的语气、音量,顺畅度,如果自己听了都不舒服,面试官可能也不舒服。
1、golang中make和new的区别?(基本必问)
共同点:给变量分配内存
不同点:
1)作用变量类型不同,new给string,int和数组分配内存,make给切片,map,channel分配内存。
2)返回类型不一样,new返回指向变量的指针,make返回变量本身。
3)new分配的空间被清零。make分配空间后,会进行初始化。
2、数组和切片的区别(基本必问)
相同点:
1)只能存储一组相同类型的数据结构。
2)都是通过下标来访问,并且有容量长度,长度通过len获取,容量通过cap获取。
区别:
1)数组是定长,访问和复制不能超过数组定义的长度,否则就会下标越界,切片长度和容量可以自动扩容。
2)数组是值类型,切片是引用类型,每个切片都引用了一个底层数组,切片本身不能存储任何数据,都是这底层数组存储数据,所以修改切片的时候修改的是底层数组中的数据。切片一旦扩容,指向一个新的底层数组,内存地址也就随之改变。
简洁的回答:
1)定义方式不一样。
2)初始化方式不一样,数组需要指定大小,大小不改变3)在函数传递中,数组切片都是值传递。
3、forrange的时候它的地址会发生变化么?
答:在fora,b:=rangec遍历中,a和b在内存中只会存在一份,即之后每次循环时遍历到的数据都是以值覆盖的方式赋给a和b,a,b的内存地址始终不变。由于有这个特性,for循环里面如果开协程,不要直接把a或者b的地址传给协程。
解决办法:在每次循环时,创建一个临时变量。
4、godefer,多个defer的顺序,defer在什么时机会修改返回值?
作用:defer延迟函数,释放资源,收尾工作。如释放锁,关闭文件,关闭链接。捕获panic。
避坑指南:defer函数紧跟在资源打开后面,否则defer可能得不到执行,导致内存泄露。
多个defer调用顺序是LIFO(后入先出),defer后的操作可以理解为压入栈中defer,return,returnvalue(函数返回值)。
执行顺序:首先return,其次returnvalue,最后defer。defer可以修改函数最终返回值。
修改时机:有名返回值或者函数返回指针。
5、能介绍下rune类型吗?
golang中的字符串底层实现是通过byte数组的,中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。
byte等同于int8,常用来处理ascii字符。
rune等同于int32,常用来处理unicode或utf-8字符。