我为Discord机器人制作了WaitForResponse
函数,并且可以正常工作,但是即使机器人期望响应,用户仍然可以使用命令。我通过使用带有用户ID和频道ID的地图来解决此问题,但后来我被可怕的fatal error: concurrent map read and write
击中了。所以我尝试使用sync.Map
,但是当我向该命令发送垃圾邮件时,它并不总是有效。当机器人期望响应时,有时我仍然可以运行命令。有什么方法可以确保在适当的时候和应该从地图中添加和删除值?
对于这些情况,sync.Mutex
可用于通过在要成为线程安全的代码周围获取lock来确保仅允许进行一次修改。
sync.Mutex
Mutex确保可以允许ONLY ONE goroutine访问locked代码,这意味着在您的情况下,只能执行一项操作,无论是读取还是写入。
为了获得更高的效率,您应该考虑使用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
}
,因为在读取地图时可能不想锁定地图。从GoDoc:
RWMutex是读取器/写入器互斥锁。锁可以由任意数量的读取器或单个写入器持有。 RWMutex的零值是未锁定的互斥锁。
sync.RWMutex