面试题答案
一键面试设计思路
- 互斥锁保护数据:使用Go语言的
sync.Mutex
来保护复杂数据结构,确保在同一时间只有一个goroutine可以访问和修改数据,从而保证数据的一致性和操作的原子性。 - 闭包封装操作:通过闭包将对复杂数据结构的操作封装起来,这样在不同函数和goroutine中调用闭包,就可以以统一的方式操作数据,同时避免直接访问数据结构带来的并发问题。
- 数据更新与读取操作:在闭包内,先获取互斥锁,执行完相应的数据更新或读取操作后,再释放互斥锁。
核心代码片段
package main
import (
"fmt"
"sync"
)
// 定义复杂数据结构
type NestedStruct struct {
Field1 string
Field2 int
// 可以有更多嵌套结构和字段
}
// 定义操作函数闭包
func createDataOperations() (func() NestedStruct, func(NestedStruct)) {
var data NestedStruct
var mu sync.Mutex
// 读取操作闭包
read := func() NestedStruct {
mu.Lock()
defer mu.Unlock()
return data
}
// 更新操作闭包
write := func(newData NestedStruct) {
mu.Lock()
defer mu.Unlock()
data = newData
}
return read, write
}
func main() {
read, write := createDataOperations()
var wg sync.WaitGroup
wg.Add(2)
// 模拟一个goroutine进行写入操作
go func() {
newData := NestedStruct{Field1: "new value", Field2: 123}
write(newData)
wg.Done()
}()
// 模拟另一个goroutine进行读取操作
go func() {
result := read()
fmt.Println(result)
wg.Done()
}()
wg.Wait()
}
在上述代码中:
- 定义了
NestedStruct
作为复杂数据结构。 createDataOperations
函数返回两个闭包,read
用于读取数据,write
用于更新数据。- 在闭包内部,通过
sync.Mutex
确保数据操作的原子性和一致性。 main
函数中启动两个goroutine分别模拟数据的写入和读取操作。