思路
- 并发安全:使用
sync.RWMutex
来保证map
的并发读写安全。RWMutex
允许多个goroutine
同时读,但只允许一个goroutine
写。
- 类型断言:在读取
map
中的值后,通过类型断言判断其具体类型,然后进行相应的计算。
关键代码逻辑
package main
import (
"fmt"
"sync"
)
func main() {
var mu sync.RWMutex
data := make(map[string]interface{})
// 模拟数据写入
mu.Lock()
data["intKey"] = 5
data["floatKey"] = 3.14
data["intSliceKey"] = []int{1, 2, 3}
mu.Unlock()
var wg sync.WaitGroup
// 模拟并发读取和计算
wg.Add(3)
go func() {
defer wg.Done()
mu.RLock()
value, ok := data["intKey"]
mu.RUnlock()
if ok {
if num, ok := value.(int); ok {
result := num + 10
mu.Lock()
data["intKey"] = result
mu.Unlock()
fmt.Printf("Int calculation result: %d\n", result)
}
}
}()
go func() {
defer wg.Done()
mu.RLock()
value, ok := data["floatKey"]
mu.RUnlock()
if ok {
if num, ok := value.(float64); ok {
result := num * 2
mu.Lock()
data["floatKey"] = result
mu.Unlock()
fmt.Printf("Float calculation result: %f\n", result)
}
}
}()
go func() {
defer wg.Done()
mu.RLock()
value, ok := data["intSliceKey"]
mu.RUnlock()
if ok {
if slice, ok := value.([]int); ok {
sum := 0
for _, num := range slice {
sum += num
}
mu.Lock()
data["intSliceKey"] = sum
mu.Unlock()
fmt.Printf("Int slice calculation result: %d\n", sum)
}
}
}()
wg.Wait()
}
- 定义一个
sync.RWMutex
实例mu
来保护map
数据。
- 使用
mu.Lock()
进行写操作,mu.RLock()
进行读操作,确保并发安全。
- 通过类型断言(
value.(type)
)判断interface{}
实际存储的数据类型,然后进行相应的计算并更新map
中的值。