golang 三年工作社招

在牛客网学到很多东西,我也来发一下面经
大概从半个月前,开始面试,有些题目有参考答案,有些没有哈,大家参考一下就行哈嘿,
迅雷面了三轮,最后一轮表现不好,好遗憾呀
最近也在面试美图,许愿美图offer,还有一些面经没发出来哈


2021-07-21 深信服面试
1、用代码实现斐波那契数列
package main


import "fmt"


func main(){
ans := Way(10)
fmt.Println(ans)
}

func Way(n int) []int{
ans := make([]int,n)
way(n-1,ans)
return ans
}

func way(n int,arr []int){
if n == 0 || n == 1{
arr[n] = 1
return
}
way(n-1,arr)
way(n-2,arr)
arr[n] = arr[n-1] + arr[n-2]
}
2、考察切片的扩容问题:
package main


import (
"fmt"
"strings"
)


func main(){
bArr := []byte("AAAA/BBBBBBBBBBB")
index := strings.IndexByte(string(bArr),'/')
arr1 := bArr[:index] // AAAA
arr2 := bArr[index+1:] // BBBBBBBBB
fmt.Printf("%s \n",arr1)
fmt.Printf("%s \n",arr2)
arr1 = append(arr1,[]byte("prefix")...)
fmt.Printf("%s \n",arr1) // AAAAprefix
fmt.Printf("%s \n",arr2) // refixBBBBBB
}
3、使用一个无缓存channel,如何打印A 1 B 2 C 3 D 4 E 5
package main


import (
"fmt"
"time"
)


func main(){
nChan := make(chan string)
stop := make(chan struct{},2)
finish := make(chan struct{})
go func(){
for item := range nChan{
time.Sleep(2*time.Second)
fmt.Println(item)
}
finish<- struct{}{}
}()
go func() {
for i := 0; i < 10; i++ {
nChan<-fmt.Sprintf("%d",i+1)
}
stop<- struct{}{}
}()
go func() {
for i := 0; i < 10; i++ {
nChan<-fmt.Sprintf("%c",i+'A')
}
stop<- struct{}{}
}()
<-stop
<-stop
close(nChan)
<-finish
fmt.Println("打印完成")
}

4、有看过gin框架的源码不?
5、Redis是如何实现备份的?
1、redis采用RDB + AOF 混合机制备份
2、先将redis的数据序列化成RDB格式,然后在备份过程中的执行的命令使用AOF记录

5、Redis是如何处理过期数据的?

2021-07-22 信锐科技一轮
‌1、redis你们用的什么模式?       答:使用的是集群模式

‌2、redis主节点挂了,怎么处理?    答: 会从挂掉的从节点选举出新的master节点,然后执行槽的转移操作

‌3、mysql索引为什么用B+树,不用hashmap?    答: B+对范围时间复杂度好一些


4‌、一般explain后你会着重看哪些指标?      答:看命中的索引、扫描的行数、以及是否在内存执行过排序


5‌、什么时候用联合索引,什么时候用单列索引?     答: 联合索引的占用的磁盘空间比单列索引大,,如果某个字段是必填,其他字段是选填可以使用联合索引,如果两个字段都不是必填,可以选择分别在两个字段单独建索引


‌6、go的channel和goroutines配合使用后,如何在接收到程序的推出通知后有呀退出和关闭?
答:
声明:
Achannel 是数据通道,用来传递消费的数据,
Bchannal 用来管理生产者生产完毕退出,
Cchannel 用来管理消费者消费完毕优雅退出
原则是:生产者必须全部停止生产后,才能关闭数据通道Achannel
1、Bchannal其大小为生产者的个数n,每个生产者停止生产后,都必须往额外的Bchannal塞数据,
2、main函数把消费完Bchannel的n个数据后,从而知道所有生产者已经停止生产
3、此时,关闭Achannel
4、消费者goroutine内部都使用 for  item:= range Achannel的方式能够及时感知chan的退出
5、消费者完之后,往Cchannel 写入数据,channel C大小为消费者个数m
6、main函数消费完channel C 的m个数据后
7、此时就能优雅退出了


示例代码:
package main


import (
"fmt"
"time"
)


func main(){
// 数据通道
aChan := make(chan string)
// 生产者 已停止信号,因为有两个生产者,所以chann的大小为2
bChan := make(chan struct{},2)
cChan := make(chan struct{})
// 消费者
go func(){
for item := range aChan{
time.Sleep(1*time.Second)
fmt.Println(item)
}
cChan<- struct{}{}
}()
// 生产者1
go func() {
for i := 0; i < 10; i++ {
aChan<-fmt.Sprintf("%d",i+1)
}
bChan<- struct{}{}
}()
// 生产者2
go func() {
for i := 0; i < 10; i++ {
aChan<-fmt.Sprintf("%c",i+'A')
}
bChan<- struct{}{}
}()
<-bChan
<-bChan
fmt.Println("生产者不再生产数据,准备关闭数据通道")
close(aChan)
fmt.Println("关闭数据通道")
<-cChan
fmt.Println("剩余数据已经全部消费完毕")
fmt.Println("优雅退出")
}

‌8、怎么管理goroutine生命周期?
答:通过借用context,可以控制goroutine退出,以及通过channel,知道其退出


‌9、怎么打印链表的倒数第n个数 ?
答: 快指针先走n步,然后快慢指针一块走


‌10、软连接和硬链接的区别


‌11、select和epoll的区别
答: 一个主动式,一个被动式,一个复杂度O(n),一个复杂度log(n)


12、你们项目当中是如何使用分布式事务的?

声明:有两个服务,分别是   支付宝服务、余额宝服务
情景:支付宝要往余额宝存1万快
1、支付宝服务,往msg表插入一条数据,表示支付宝转账1万给余额宝,同时支付宝余额也扣减1万,
2、通过定时轮询msg表或者canal订阅msg表的binlog,发现有新插入的数据后
3、将msg投递给消息队列,余额宝服务通过订阅队列,消费后,往支付宝服务回复确认
4、同时余额宝要做好幂等操作,避免重复消费

13、golang中make和new的区别?
1、new(T)的方式返回*T类型的对象
2、make(T)的方式返回T类型的对象
3、new方式会分配一个内存空间,但不会初始化结构
4、make一般用来初始化slice,map、channel

14、什么时候会内存逃逸?
答:在方法内部的返回值被外部引用,就会发生内存逃逸

15、golang的方法之前的传值时引用传递还是值传递?
答:值传递

16、mysql 慢查询, explain要看哪些字段?

2021-07-23迅雷面试
1、怎么解决数据库幻读?
答:
将数据库隔离级别设置为可重复读,查询时加for update ,引入间隙锁

在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现,想要解决可重复读隔离级别下的幻读,就要引入间隙锁(可重复读隔离级别下,加for update 会带上间隙锁)
请参考这边文章:https://database.51cto.com/art/201903/593667.htm 里面详细介绍了 脏读,不可重复读,幻读


2、mysql的mvcc是什么?
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

具体可参考这篇文章:https://www.jianshu.com/p/8845ddca3b23

3、简单说一下快排,思路就好?
答:略


4、go的map是如何扩缩容?


5、为什么不推荐使用redis作为分布式锁?
答:主节点挂掉,从节点还没来得及同步,容易导致同一时间多个锁存在


6、微服务有什么特点?
答:
1、服务的职责单一
2、独立进程,可以隔离部署
3、可拓展

缺点:
1、复杂度高
2、服务之间通过网络通信,影响性能



7、跳表、b+树、b树有什么区别,b+树的叶子节点是双向链表还是双循环链表
1、b+树与b树的区别?b+树会非叶子节点只存储索引的key,不存储data
2、跳表与b+树的区别? b+树是基于二叉树构建的,而跳表是一种新的构建方式,其时间复杂度两个都是log(N),但是跳表实现起来非常简单

8、go的设计模式你了解有多少?
1、了解单例模式
2、了解工厂模式
3、了解模板模式(go官方的heap包)
4、 选线模式(grpc的NewServer方法)



9、画一下你们项目的一个基础架构图


10、客户端发起一个请求到你们服务器的一个过程是怎么样的
域名 -> dns -> pass网关 -> lvs -> 服务

11、mysql数据库的索引是存储在内存里,还是磁盘上?   磁盘


12、你是怎么获取到数据库行锁的?  select  *  from table where id in (1,2,4) for update 来获取


#社招##面经##深信服#
全部评论

相关推荐

5 34 评论
分享
牛客网
牛客企业服务