我正在为我的 Discord 机器人制作一个WaitForResponse功能,它可以工作,但即使机器人期待响应,用户仍然可以使用命令。我通过使用带有用户和频道 ID 的地图来解决这个问题,但随后我被可怕的fatal error: concurrent map read and write. 所以我尝试使用 a sync.Map,但是当我向命令发送垃圾邮件时它并不总是有效。当机器人期待响应时,我有时仍然可以运行命令。有什么方法可以确保在地图中添加和删除这些值?
1 回答
森栏
TA贡献1810条经验 获得超5个赞
对于这些场景,可用于通过获取您希望线程安全的代码周围的锁sync.Mutex来确保只允许进行一次修改。
var mu sync.Mutex
func readMap(key string) {
mu.Lock()
defer mu.Unlock()
return yourMap[key]
}
func updateMap(key, value string) {
mu.Lock()
defer mu.Unlock()
yourMap[key] = value
}
Mutex 确保只有一个goroutine 可以被允许访问锁定的代码,这意味着对于您的情况,只能执行一个操作,读取或写入。
为了提高效率,您应该考虑使用,sync.RWMutex因为您可能不想在读取地图时锁定地图。来自 GoDoc:
RWMutex 是读写器互斥锁。锁可以由任意数量的读取器或单个写入器持有。RWMutex 的零值是未锁定的互斥锁。
var mu sync.RWMutex
func readMap(key string) {
mu.RLock()
defer mu.RUnlock()
return yourMap[key]
}
func updateMap(key, value string) {
mu.Lock()
defer mu.Unlock()
yourMap[key] = value
}
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消