golang面试题整理
1、go的调度
2、go struct能不能比较
因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型
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,select
8、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]bool
sync.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值,可以利用这点(这里也有点跟面试官说不明白)
36、用过什么消息中间件之类吗?没有
37、有什么问题吗?评价?后面还有面试,后面再问吧
38、生产者消费者模式,手写代码(Go直接使用channel实现很简单,还想着面试官会不会不让用channel实现,不用channel的可以使用数组加条件变量),channel缓冲长度怎么决定,怎么控制上游生产速度过快,这里没说出解决方案,只是简单说了channel长度可以与上下游的速度比例成线性关系,面试官说这是一种解决方案
39、手写循环队列
40、写的循环队列是不是线程安全,不是,怎么保证线程安全,加锁,效率有点低啊,然后面试官就提醒Go推崇原子操作和channel
41、写完代码面试官说后面问的问题回答就可以,不知道的话没关系
42、Linux会不会,只会几个命令,面试官就说一共也就一百多个命令
43、TimeWait和CloseWait原因
44、线段树了解吗?不了解,字典树?了解
45、看过啥源码,nsq(Go的消息中间件),简单问了我里面的waitgroup包证明我看过
46、sync.Pool用过吗,为什么使用,对象池,避免频繁分配对象(GC有关),那里面的对象是固定的吗?不清楚,没看过这个的源码
47、有什么问题吗?评价?基础不错,Linux尚缺,Go的理解不够深入,高级数据结构不了解,优点是看源码
48、后面面试官讲了他们做的东西,主要是广告部分,说日均数据量至少百万以上,多达上亿,高并发使用Go支撑,有微服务,服务治理,说我需要学的东西挺多的
49、证明二叉树的叶子节点跟度数为2的节点的关系
50、唯一索引和主键索引
51、智能指针
52、字符串解析为数字(考虑浮点型)
53、单点登录,tcp粘包
54、手写洗牌
55、处理粘包断包实现,面试官以为是negle算法有关,解释了下negle跟糊涂窗口综合征有关,然后面试官觉得其他项目是crud就没问了
56、goroutine调度用了什么系统调用,这个不会,面试官想从go问到操作系统,然后以为***作系统基础不好,就问了操作系统问题
57、进程虚拟空间分布,全局变量放哪里?答上来了,操作系统就不问了
58、有没有网络编程,有,怎么看连接状态?netstat,有哪些?ESTABLISHED,LISTEN等等,有异常情况吗?TIME_WAIT很多,为什么?大量短链接
59、几种基本排序算法说一下,问了堆的时间复杂度,稳定性,为什么不稳定
60、 topk问题,海量数据topk(回答成切分多次加载内存,然后用维持k长度的有序链表,然后被说时间复杂度不好,提示说还是用堆,然后哦哦哦对)
最长连续字串和,这里我说的解决方案没用dp(对dp不熟),面试官一直引导我dp,还是不会
61、什么是主键
62、联合索引和唯一索引
62、越多的索引越好吗?
63、建立索引要注意什么?
64、进程和线程区别?
65、死锁?
66、tcp三次握手
67、http,https
68、状态码401,301,302,201
69、项目我说只有一台机子,所以用的单机部署,面试官说单机也可以部署多个,有什么方法吗?我说docker,问docker有哪些网络,不熟,dockerfile关键字,只答几个。顺便扯了下nginx转发。
70、数据库隔离级别,提交读会造成什么
71、go调度
72、 goroutine泄漏有没有处理,设置timeout,select加定时器
73、mysql高可用的方案
74、进程线程区别
75、排序算法以及时间复杂度
76、怎么学习go
77、go的线程,给他讲了跟goroutine调度
78、io模型,同步阻塞,同步非阻塞,异步
79、cookie和session
实习项目
优缺点
同学的评价
兴趣爱好
有什么offer
80、接口kps测试
81、redis排行榜数据结构(跳跃表),查询时间复杂度
82、redis分布式,如何减少同步延迟
83、mysql能实现redis的功能吗
84、平时怎么学习?
85、看什么书?
86、兴趣爱好
87、看过google四篇分布式论文吗,没看过
89、cap理论,举例
90、LRU算法,LFU
91、讲讲怎么理解网络编程
92、go使用踩过什么坑(for range,数据库连接defer close)
93、go优缺点
95、go的值传递和引用
96、慢查询
97、为什么使用pg
98、redis的数据类型
99、所有左叶子节点的和
100、m个n大小的有序数组求并集,一开始是2路归并,求时间复杂度,后来在面试官提醒直接m路归并,求时间复杂度
101、static关键字,还有其他关键字吗
102、hash表设计,线程安全?
103、 线程自己独享什么
104、网络编程过程
105、select、epoll
106、看什么书
107、排行榜怎么实现
108、go的锁如何实现,用了什么cpu指令
109、go的runtime如何实现
110、看过sql的连接池实现吗
111、ctx包了解吗?有什么用?
112、go什么情况下会发生内存泄漏?(他说ctx没有cancel的时候,这个真不知道)
113、怎么实现协程完美退出?
114、智力题:1000瓶酒中有1瓶毒酒,10只老鼠,7天后毒性才发作,第8天要卖了,怎么求那瓶毒酒?
115、简单dp题,n*n矩阵从左上角到右下角有多少种走法(只限往下和往右走)
116、用channel实现定时器?(实际上是两个协程同步)
117、go为什么高并发好?讲了go的调度模型
118、操作系统内存管理?进程通讯,为什么共享存储区效率最高
119、实现一个hashmap,解决hash冲突的方法,解决hash倾斜的方法
120、怎么理解go的interface
121、100亿个数选top5,小根堆
122、数组和为n的数组对
123、最大连续子数组和
124、redis容灾,备份,扩容
125、跳跃表,为什么使用跳跃表而不使用红黑树
126、输入url后涉及什么
127、tcp怎么找到哪个套接字
128、ipc方式,共享存储区原理
130、进程虚拟空间布局
131、进程状态转换
132、线程的栈在哪里分配
133、多个线程读,一个线程写一个int32会不会有问题,int64呢(这里面试官后来说了要看数据总线的位数,32位的话写int32没问题,int64就有问题)
134、判断二叉树是否为满二叉树
135、lru实现
136、一个大整数(字符串形式表示的),移动字符求比它大的数中最小的
137、点赞系统设计
项目