golang面试题

发布于:2024-04-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

基础题

Go 的优势是什么?

  • 天然支持并发,通过Goroutine和通道实现的
  • 支持静态链接,将程序依赖的库文件在编译时直接链接到可执行文件中,形成一个独立的可执行文件,这样可执行文件就包含了所有运行所需的代码和库,无需担心依赖关系
  • 编译语言,效率更高

Go 程序中的包是什么?

数组和切片的区别是什么?

1、数组长度固定,切片长度不固定

2、数组是值类型,切片是引用类型。当切片传递给函数时,即使它是按值传递的,函数内部所做的更改在函数外部也可见

new和make的区别是什么?

channel有什么特点?和带缓冲的channel有什么区别?

什么是 Goroutine?你如何停止它?

如何在运行时检查变量类型?

defer关键字有什么作用?

什么是交叉编译?

 在一个平台上生成可以在另外一个平台执行的文件。具体命令如下:

# 要去linux下执行
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
# 要去Mac下执行
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# 要去win下执行
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

进阶题

如何在Go语言中实现错误处理?

并发同步是什么?在Go语言中,如何实现并发同步?

Go语言中的并发安全性是什么?如何确保并发安全性?

Map是线程安全的吗?

线程不安全, 一个 goroutine 在对 map 进行写的时候,另外的 goroutine 不能进行读和写操作

Go语言的泛型是什么,它们有什么用途?

在Go语言中,如何进行网络编程?

GMP指的是什么?

Go 语言中 GC 的流程是什么?

互斥锁(Mutex)

使用场景:写操作频繁

什么是Mutex互斥锁?它在并发编程中的作用是什么?

Mutex互斥锁是一种并发控制机制,用于保护共享资源的访问,以防止多个goroutine同时对该资源进行修改。它提供了两个基本操作:Lock和Unlock。当一个goroutine获得了Mutex的锁时,其他goroutine将被阻塞,直到该goroutine释放了锁。

Mutex 几种状态
Mutex 正常模式和饥饿模式

正常模式是Mutex互斥锁的默认模式。在正常模式下,Mutex采用公平的先进先出策略,保证了goroutine的公平性。当一个goroutine尝试获取锁时,如果锁处于加锁状态,该goroutine会被放入等待队列中,等待锁的释放。当锁被解锁后,等待队列中的goroutine会按照先后顺序获取锁。

Mutex 允许自旋的条件

读写锁(RWMutex)

使用场景:读操作频频率远高于写操作

有了Mutex为什么还需要RWMutex,解决了什么问题?

虽然Go语言中的Mutex互斥锁可以保证对共享资源的独占访问,但在大量并发读操作和少量并发写操作的场景下,Mutex会造成不必要的锁等待,影响性能。因此,引入了RWMutex读写锁,它在读锁占用的情况下,会阻止写操作,但不阻止读操作;在写锁占用的情况下,会阻止其他goroutine(读和写)进来,整个锁相当于由该goroutine独占。这样可以提高读操作的并发性,从而提高性能。因此,当需要明确区分reader和writer的协程场景,且是大量的并发读、少量的并发写时,可以考虑使用RWMutex替换Mutex
 

RWMutex 实现
RWMutex 注意事项