面试题答案
一键面试- 采用的同步机制:
- 使用
sync.Mutex
来保证对globalSlice
的读写操作的原子性,避免数据竞争。sync.Mutex
是Go语言标准库中提供的互斥锁,它可以保证同一时间只有一个协程能够访问被保护的资源。
- 使用
- 处理切片边界情况:
-
追加元素:
var mu sync.Mutex globalSlice := make([]int, 10) func appendToSlice(newValue int) { mu.Lock() defer mu.Unlock() globalSlice = append(globalSlice, newValue) }
在追加元素前,先获取锁,这样其他协程不能同时进行追加或修改操作。追加操作本身是安全的,因为Go语言的
append
函数会自动处理切片的扩容等边界情况。 -
根据索引修改值:
func setValueAtIndex(index, value int) { mu.Lock() defer mu.Unlock() if index < 0 || index >= len(globalSlice) { // 处理越界情况,这里简单返回,实际应用中可以根据需求处理,比如记录日志等 return } globalSlice[index] = value }
在根据索引修改值前,同样先获取锁。然后检查索引是否越界,如果越界则不进行操作并处理越界情况,在获取锁的情况下,其他协程不能修改切片长度,所以可以保证索引判断的正确性。
-
读取切片元素:
func getValueAtIndex(index int) int { mu.Lock() defer mu.Unlock() if index < 0 || index >= len(globalSlice) { // 处理越界情况,这里简单返回0,实际应用中可以根据需求处理 return 0 } return globalSlice[index] }
读取操作也需要获取锁,以防止在读取过程中切片被其他协程修改。同样要检查索引是否越界,确保不会读取到无效数据。
-
通过这种方式,利用sync.Mutex
保证了切片操作的原子性,同时在操作前检查边界条件,避免了越界问题,从而确保在并发环境下切片操作的正确性。