基础题
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