我正在尝试解决警告:数据竞赛 这是代码:
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字段请求更改为整数,则一切正常,但不适用于map。如何在Go中正确锁定地图?
答案 0 :(得分:1)
GetRequests
返回对映射的引用,因此,如果其他代码调用该函数并在不获取锁的情况下对返回的映射执行r / w,则将引入数据争用
答案 1 :(得分:0)
使用sync.RWMutex
<div>
Some text and <span>some highlighted text<span>
</div>
func (s *Stats) PutRequest(ut int64) {
s.Lock()
defer s.Unlock()
s.request[ut]++
}
在这种情况下,以下频道示例可能会很有趣。 go by example - stateful goroutines
无论如何,您都需要在返回地图之前复制地图。