【Golang】Go3到5年常见的⾯试题
1、go中常量是怎么实现
2、go struct能不能⽐较
菜单模板免费下载
因为是强类型语⾔,所以不同类型的结构不能作⽐较,但是同⼀类型的实例值是可以⽐较的,实例不可以⽐较,因为是指针类型
3、go defer(for defer),先进后出,后进先出
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
}
}
4、golang的make和new的区别是什么
new有点像c++⾥⾯的new,⽤来初始化各种type,然后返回其指针。只不过由于没有构造函数的存在,所以全部⽤零值来填充,⽐较特殊的是
slice,map,channel,它们的零值都是nil。另外由于golang直接可以⽤&struct{} 形式来初始化,所以平时⽤到new的机会也⽐较少。
make是⽤来初始化map,slice,以及channel的,它返回的不是指针,⽽是对象本⾝。另外,make出来的map,slice,channel都是可以直接使⽤的。
5、golang 的channel是怎么实现的
golang的channel是个结构体,⾥⾯⼤概包含了三⼤部分:
a. 指向内容的环形缓存区,及其相关游标
b. 读取和写⼊的排队goroutine链表
c. 锁
任何操作前都需要获得锁,当写满或者读空的时候,就将当前goroutine加⼊到recvq或者sendq中,并出让cpu(gopark)。
6、简单描述下golang的gc算法
golang现⾏的gc算法是三⾊标记法,三⾊指的是在gc过程中会把对象标记给⿊,灰,⽩三⾊。
三⾊标记法是对标记-清除算法的优化,⽬的是减少stop the world的时间。
7、recover能处理所有的异常吗
8、select可以⽤于什么,常⽤语gorotine的完美退出
golang 的 select 就是监听 IO 操作,当 IO 操作发⽣时,触发相应的动作
每个case语句⾥必须是⼀个IO操作,确切的说,应该是⼀个⾯向channel的IO操作
9、context包的⽤途
Context通常被译作上下⽂,它是⼀个⽐较抽象的概念,其本质,是【上下上下】存在上下层的传递,上会把内容传递给下。在Go语⾔中,程序单元也就指的是Goroutine
10、client如何实现长连接
11、主协程如何等其余协程完再操作
使⽤channel进⾏通信,context,select
12、slice,len,cap,共享,扩容
append函数,因为slice底层数据结构是,由数组、len、cap组成,所以,在使⽤append扩容时,会查看数组后⾯有没有连续内存快,有就在后⾯添加,没有就重新⽣成⼀个⼤的素组13、map如何顺序读取
map不能顺序读取,是因为他是⽆序的,想要有序读取,⾸先的解决的问题就是,把key变为有序,所以可以把key放⼊切⽚,对切⽚进⾏排序,遍历切⽚,通过key取值。14、实现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
}
15、实现消息队列(多⽣产者,多消费者)
使⽤切⽚加锁可以实现
16、⼤⽂件排序
归并排序,分⽽治之,拆分为⼩⽂件,在排序
17、基本排序,哪些是稳定的
18、http能不能⼀次连接多次请求,不等后端返回
http本质上市使⽤socket连接,因此发送请求,接写⼊tcp缓冲,是可以多次进⾏的,这也是http是⽆状态的原因
19、tcp与udp区别,udp优点,适⽤场景
tcp传输的是数据流,⽽udp是数据包,tcp会进过三次握⼿,udp不需要
20、孤⼉进程,僵⼫进程
21、Slice与数组区别,Slice底层结构
mysql面试题sql优化
22、项⽬⾥的⽀付这块,在⽀付完通知这⾥,收到两次相同的⽀付通知,怎么防⽌重复消费(类似接⼝的幂等性),说了借助Redis或者数据库的事务
23、Go的反射包怎么到对应的⽅法(这⾥忘记怎么问的,直接说不会,只⽤了DeepEqual,简单讲了DeepEqual)
24、Mysql的索引有⼏种,时间复杂度
25、Go的channel(有缓冲和⽆缓冲)
26、退出程序时怎么防⽌channel没有消费完,
27、⽣产者消费者模式,⼿写代码,channel缓冲长度怎么决定,怎么控制上游⽣产速度过快,这⾥没说出解决⽅案,只是简单说了channel长度可以与上下游的速度⽐例成线性关系
29、⼿写循环队列,写的循环队列是不是线程安全,不是,怎么保证线程安全,加锁,效率有点低啊,Go推崇原⼦操作和channel
30、TimeWait和CloseWait原因
31、看过啥源码,nsq(Go的消息中间件)waitgroup包等
32、sync.Pool⽤过吗,为什么使⽤,对象池,避免频繁分配对象(GC有关),那⾥⾯的对象是固定的吗?
33、微服务,服务治理是怎么样的
34、证明⼆叉树的叶⼦节点跟度数为2的节点的关系
35、智能指针
36、字符串解析为数字(考虑浮点型)
37、单点登录,tcp粘包
开发者工具功能38、⼿写洗牌
39、处理粘包断包实现
40、goroutine调度⽤了什么系统调⽤?
41、进程虚拟空间分布,全局变量放哪⾥?答上来了,操作系统就不问了
42、有没有⽹络编程,有,怎么看连接状态?netstat,有哪些?ESTABLISHED,LISTEN等等,有异常情况吗?TIME_WAIT很多,为什么?⼤量短链接
43、⼏种基本排序算法说⼀下,问了堆的时间复杂度,稳定性,为什么不稳定透明颜代码查询
44、 topk问题,海量数据topk,最长连续字串和,这⾥我说的解决⽅案没⽤dp(对dp不熟)
45、项⽬我说只有⼀台机⼦,所以⽤的单机部署,⾯试官说单机也可以部署多个,有什么⽅法吗?我说docker,问docker有哪些⽹络,不熟,dockerfile 关键字,只答⼏个。顺便扯了下nginx转发。
46、数据库隔离级别,提交读会造成什么
47、 goroutine泄漏有没有处理,设置timeout,select加定时器
48、排序算法以及时间复杂度
50、go的线程,给他讲了跟goroutine调度
56、io模型,同步阻塞,同步⾮阻塞,异步
57、redis分布式,如何减少同步延迟
58、平时怎么学习?
59、看过google四篇分布式论⽂吗?
60、cap理论,举例
61、LRU算法,LFU
62、讲讲怎么理解⽹络编程
63、go使⽤踩过什么坑(for range,数据库连接defer close)
64、go优缺点
65、go的值传递和引⽤
67、m个n⼤⼩的有序数组求并集,⼀开始是2路归并,求时间复杂度,后来在⾯试官提醒直接m路归并,求时间复杂度
68、static关键字,还有其他关键字吗
69、hash表设计,线程安全?
70、线程⾃⼰独享什么
71、⽹络编程过程
72、select、epoll
73、排⾏榜怎么实现
74、go的锁如何实现,⽤了什么cpu指令
75、go的runtime如何实现
实现快速排序的算法是76、看过sql的连接池实现吗
77、ctx包了解吗?有什么⽤?
78、go什么情况下会发⽣内存泄漏?
79、怎么实现协程完美退出?
80、简单dp题,n*n矩阵从左上⾓到右下⾓有多少种⾛法(只限往下和往右⾛)
81、⽤channel实现定时器?(实际上是两个协程同步)
82、go为什么⾼并发好?go的调度模型
83、操作系统内存管理?进程通讯,为什么共享存储区效率最⾼
84、实现⼀个hashmap,解决hash冲突的⽅法,解决hash倾斜的⽅法
85、怎么理解go的interface
86、100亿个数选top5,⼩根堆
小程序api文档87、数组和为n的数组对
88、最⼤连续⼦数组和
89、跳跃表,为什么使⽤跳跃表⽽不使⽤红⿊树
90、tcp怎么到哪个套接字
91、ipc⽅式,共享存储区原理
92、进程虚拟空间布局
93、进程状态转换
94、线程的栈在哪⾥分配
95、多个线程读,⼀个线程写⼀个int32会不会有问题,int64呢
96、判断⼆叉树是否为满⼆叉树

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。