go - 如何锁定地图并修复数据竞争
问题描述
我正在尝试解决 WARNING: DATA RACE 这是代码:
package models
import (
"sync"
"time"
)
type Stats struct {
sync.Mutex
request map[int64]int
}
func (s *Stats) PutRequest() {
s.Lock()
s.request[time.Now().Unix()]++
s.Unlock()
}
func (s *Stats) GetRequests() map[int64]int {
s.Lock()
m := s.request
s.Unlock()
return m
}
var Requests = Stats{
sync.Mutex{},
make(map[int64]int),
}
如果我将 Stats 字段请求更改为整数,则一切正常,但不适用于地图。如何在 Go 中正确锁定地图?
解决方案
使用 sync.RWMutex
func (s *Stats) PutRequest(ut int64) {
s.Lock()
defer s.Unlock()
s.request[ut]++
}
func (s *Stats) GetRequests() map[int64]int {
s.RLock()
defer s.RUnlock()
m := make(map[int64]int, len(s.request))
for k, v := range s.request {
m[k] = v
}
return m
}
在这种情况下,以下通道示例可能会很有趣。举个例子——有状态的 goroutines
无论如何,您需要在返回之前复制地图。
推荐阅读
- azure-data-factory - Azure 数据工厂 - 如何在 Azure SQL 中将字符串 HH:mm 转换为 Time(7) 类型?
- blazor - 找不到 Blazor InputFile IFileListEntry
- c++ - ROS 2订阅者回调与成员类的方法
- ssas - 分析服务多维 - 向现有多维数据集添加新度量
- flutter - FlutterBloc 对 Blocs 的初始状态做出反应
- django - /api/logout 'AnonymousUser' 对象的 AttributeError 没有属性 'auth_token'
- php - 如何解密哈希密码[它不起作用]?
- swift - 关于 Property Wrapper 的初始化器
- flutter - NoSuchMethodError:在 null 上调用了 getter 长度
- python - 在同一路由中返回 Python Flask 中的多个语句