go语言137道面试题整理汇总

1、go的调度
2、go struct能不能比较
Go语言中文文档:www.topgoer.com
因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型3、go defer(for defer),先进后出,后进先出
func b() {for i := 0; i < 4; i++ {defer fmt.Print(i)}}4、select可以用于什么,常用语gorotine的完美退出
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作5、context包的用途Context通常被译作上下文,它是一个比较抽象的概念,其本质,是【上下上下】存在上下层的传递,上会把内容传递给下 。在Go语言中,程序单元也就指的是Goroutine
6、client如何实现长连接
server是设置超时时间,for循环遍历的7、主协程如何等其余协程完再操作
使用channel进行通信,context,select8、slice,len,cap,共享,扩容
Append函数,因为slice底层数据结构是,由数组、len、cap组成,所以,在使用append扩容时,会查看数组后面有没有连续内存快,有就在后面添加,没有就重新生成一个大的素组9、map如何顺序读取
map不能顺序读取,是因为他是无序的,想要有序读取,首先的解决的问题就是,把key变为有序,所以可以把key放入切片,对切片进行排序,遍历切片,通过key取值 。10、实现set
type inter interface{}type Set struct {m map[inter]boolsync.RWMutex} func New() *Set {return &Set{m: map[inter]bool{},}}func (s *Set) Add(item inter) {s.Lock()defer s.Unlock()s.m[item] = true}11、实现消息队列(多生产者,多消费者)
使用切片加锁可以实现12、大文件排序
归并排序,分而治之,拆分为小文件,在排序13、基本排序,哪些是稳定的14、http get跟head
HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息 。有的人可能觉得这个方法没什么用,其实不是这样的 。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确 。15、http 401,403
400 bad request,请求报文存在语法错误401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息403 forbidden,表示对请求资源的访问被服务器拒绝404 not found,表示在服务器上没有找到请求的资源16、http keep-alive
client发出的HTTP请求头需要增加Connection:keep-alive字段Web-Server端要能识别Connection:keep-alive字段,并且在http的response里指定Connection:keep-alive字段,告诉client,我能提供keep-alive服务,并且"应允"client我暂时不会关闭socket连接17、http能不能一次连接多次请求,不等后端返回
http本质上市使用socket连接,因此发送请求,接写入tcp缓冲,是可以多次进行的,这也是http是无状态的原因18、tcp与udp区别,udp优点,适用场景
tcp传输的是数据流,而udp是数据包,tcp会进过三次握手,udp不需要19、time-wait的作用
20、数据库如何建索引
21、孤儿进程,僵尸进程
22、死锁条件,如何避免
23、linux命令,查看端口占用,cpu负载,内存占用,如何发送信号给一个进程
24、git文件版本,使用顺序,merge跟rebase
26、Slice与数组区别,Slice底层结构
27、项目里的微信支付这块,在支付完微信通知这里,收到两次微信相同的支付通知,怎么防止重复消费(类似接口的幂等性),说了借助redis或者数据库的事务
28、项目里的消息推送怎么做的(业务有关)
29、Go的反射包怎么找到对应的方法(这里忘记怎么问的,直接说不会,只用了DeepEqual,简单讲了DeepEqual)
30、Redis基本数据结构
31、Redis的List用过吗?底层怎么实现的?知道但是没用过,不知道怎么实现
32、MySQL的索引有几种,时间复杂度
33、InnoDb是表锁还是行锁,为什么(这里答不出来为什么,只说了行锁)
34、Go的channel(有缓冲和无缓冲)
35、退出程序时怎么防止channel没有消费完,这里一开始有点没清楚面试官问的,然后说了监听中断信号,做退出前的处理,然后面试官说不是这个意思,然后说发送前先告知长度,长度要是不知道呢?close channel下游会受到0值,可以利用这点(这里也有点跟面试官说不明白)


推荐阅读