2024年我们又更新了一波大厂面经!_golang 初级 面经,Golang最牛教材

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. go垃圾回收?三色标记法?读写屏障?STW?

go1.18之后垃圾回收采用三色标记法和混合写屏障。

三色标记法:

将对象标记为白色,灰色或黑色。

白色:不确定对象(默认色);黑色:存活对象。灰色:存活对象,子对象待处理。

标记开始时,先将所有对象加入白色集合(需要STW)。首先将根对象标记为灰色,然后将一个对象从灰色集合取出,遍历其子对象,放入灰色集合。同时将取出的对象放入黑色集合,直到灰色集合为空。最后的白色集合对象就是需要清理的对象。

这种方法有一个缺陷,如果对象的引用被用户修改了,那么之前的标记就无效了。因此Go采用了写屏障技术,当对象新增或者更新会将其着色为灰色。
一次完整的GC分为四个阶段:

  1. 准备标记(需要STW),开启写屏障。
  2. 开始标记
  3. 标记结束(STW),关闭写屏障
  4. 清理(并发)

基于插入写屏障和删除写屏障在结束时需要STW来重新扫描栈,带来性能瓶颈。混合写屏障分为以下四步:

  1. GC开始时,将栈上的全部对象标记为黑色(不需要二次扫描,无需STW);
  2. GC期间,任何栈上创建的新对象均为黑色
  3. 被删除引用的对象标记为灰色
  4. 被添加引用的对象标记为灰色

总而言之就是确保黑色对象不能引用白色对象,这个改进直接使得GC时间从 2s降低到2us。

CSP并发模型

  1. channel使用场景?CSP思想?优势?

在并发编程中,两个goroutine之间使用channel进行通信。

CSP思想是指通过通信来共享内存,而不是通过共享内存来实现通信。

CSP思想优势是使用非常灵活,缺点是容易造成死锁。

互斥锁和读写锁

  1. go的锁有哪些?互斥锁的读写锁的区别?

互斥锁和读写锁。

互斥锁是有一个goroutine获取到互斥锁后,其他goroutine必须要等待锁被释放才能获取到锁。

而读写锁是可以允许多个goroutine获取到读锁执行读操作,但是写锁被获取了就和互斥锁一样了,其他goroutine必须等待写锁释放才能获取到读锁或者写锁。

sync

  1. sync包还有什么?sync.map介绍一下?如何保证并发安全?

sync.waitgroup, sync.map ,sync.Lock, sync.RWLock,sync.Pool…

sync.map 底层有两个map,一个是read,一个是dirty, 在读操作时优先在read中查找,read没有就去dirty中查找,写操作时如果read中有则利用CAS机制尝试更新value值,read中没有则写入 dirty 中。在 misses >= len(dirty)时,同步read 和 dirty的数据。

在read中不需要加锁,在dirty中需要加锁

sync.map通过read和dirty实现读写分离来减少锁时间来提高并发效率

协程池

  1. sync.Pool?了解线程池吗?优势亮点?未工作的线程如何等待?协程池?

sync.Pool 其实就是一个线程安全对象池,用于保存复用临时对象,在大批量申请和释放相同类型的临时对象时使用 sync.Pool 可以减少很多内存分配和回收操作减小GC压力

线程池是一种并发编程的技术,可以管理复用线程,提供一种高效的方式来处理并发。

线程池优势亮点:
  1. 提高性能,线程池通过复用线程,减少线程频繁地创建和销毁,避免线程的频繁创建和销毁的开销。
  2. 控制并发度,线程池可以控制并发任务的数量,通过设计线程池的大小来控制并发度,避免激烈的锁竞争导致系统性能的下降。
  3. 提高响应速度, 线程池可以提前创建好线程,在任务到来时可以立即处理任务,提高系统的响应速度。
  4. 资源管理,线程池可以更好的对线程进行调度和管理,避免线程资源的浪费。
未工作的线程可以通过以下方式等待:
  1. 使用条件变量:线程可以使用条件变量来等待某个条件的发生。当线程需要等待时,它可以调用条件变量的等待函数,将自己置于等待状态,直到条件满足时被唤醒。
  2. 使用信号量:线程可以使用信号量来进行等待操作。线程在需要等待时,可以调用信号量的等待操作,将自己阻塞,直到其他线程释放信号量时被唤醒。
  3. 使用锁和条件变量组合:线程可以使用锁和条件变量的组合来实现等待操作。线程在需要等待时,可以先获取锁,然后检查条件是否满足,如果条件不满足,则调用条件变量的等待函数将自己置于等待状态,直到条件满足时被唤醒。

协程池和线程池基本差不多,可以更好地管理和复用协程,提高系统的性能和资源利用率。

协程泄露

  1. 防止Go协程泄露/未关闭?(waitgroup,context)

通过管道channel通知关闭,使用waitgroup监控协程全部退出,使用contex上下文来设置超时或者手动cancle关闭协程

select的用法?执行顺序?

select{
 case <-ctx.Done():
return
 case <-
 default:
}

执行顺序是随机的

map

  1. 什么可以作为map的键?结构体可以吗?

实现了 == 操作的可以比较的就可以作为map的键(基本数据类型、数组等),结构体中如果所有字段都可以比较那么久可以作为键,否则不行。

微服务

  1. 微服务之间通信方式 rpc、grpc、http等
介绍一下grpc?protobuf/json区别与优势?

GRPC是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并基于HTTP/2协议实现。它允许在不同的计算机之间进行跨语言和跨平台的通信,使得构建分布式系统变得更加简单和高效。

GRPC使用Protocol Buffers(简称Protobuf)作为默认的序列化机制,而不是使用JSON。

Protobuf是一种轻量级的数据交换格式,具有以下优势:

  1. 效率高:Protobuf使用二进制编码,相比于文本格式的JSON,它的编码和解码速度更快,传输的数据量更小,节省了带宽和存储空间。
  2. 可读性好:虽然Protobuf是二进制格式,但它的定义文件是可读的,易于理解和维护。相比之下,JSON是一种文本格式,可读性较好,但在大型数据结构的情况下,Protobuf的定义文件更加清晰和简洁。
  3. 跨语言支持:Protobuf支持多种编程语言,包括Java、C++、Python等,这使得在不同语言之间进行通信变得更加方便。
  4. 版本兼容性:Protobuf支持向后和向前兼容的数据格式演化,这意味着可以在不破坏现有客户端和服务端的情况下,对数据结构进行扩展和修改。

相比之下,JSON是一种常用的文本格式,具有以下特点:

  1. 可读性好:JSON使用文本格式,易于阅读和理解,对于调试和开发过程中的数据交换非常方便。
  2. 平台无关性:JSON是一种独立于编程语言的数据格式,几乎所有的编程语言都支持JSON的解析和生成。
  3. 灵活性:JSON支持动态的数据结构,可以轻松地添加、删除和修改字段,适用于一些需要频繁变动的数据。

总的来说,GRPC使用Protobuf作为默认的序列化机制,相比于JSON,Protobuf在性能、可读性和跨语言支持方面具有优势。然而,选择使用GRPC还是JSON取决于具体的应用场景和需求。

介绍一下Gorm优势?

简单易用、支持多种数据库、自动迁移、支持事务、

Redis

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

img-zaexNy1b-1715668141992)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值