Dictionary 可靠的线程安全映射

Dictionary 可靠的线程安全映射,dictionary,go,concurrency,discord,Dictionary,Go,Concurrency,Discord,我为我的Discord机器人制作了一个WaitForResponse函数,它可以工作,但是用户仍然可以使用命令,即使机器人需要响应。我通过使用带有用户和通道ID的映射来解决这个问题,但随后我遇到了可怕的致命错误:并发映射读写。因此,我尝试使用sync.Map,但是当我对该命令发送垃圾邮件时,它并不总是起作用。当机器人期待响应时,我有时仍然可以运行命令。是否有任何方法可以确保在应该的时候从映射中添加和删除值?对于这些场景,可以通过获取希望线程安全的代码周围的锁来确保只允许一次修改 var mu s

我为我的Discord机器人制作了一个WaitForResponse函数,它可以工作,但是用户仍然可以使用命令,即使机器人需要响应。我通过使用带有用户和通道ID的映射来解决这个问题,但随后我遇到了可怕的致命错误:并发映射读写。因此,我尝试使用sync.Map,但是当我对该命令发送垃圾邮件时,它并不总是起作用。当机器人期待响应时,我有时仍然可以运行命令。是否有任何方法可以确保在应该的时候从映射中添加和删除值?

对于这些场景,可以通过获取希望线程安全的代码周围的锁来确保只允许一次修改

var mu sync.Mutex func readMapkey字符串{ 木锁 延迟mu解锁 返回地图[键] } func updateMapkey,值字符串{ 木锁 延迟mu解锁 yourMap[key]=值 } 互斥确保只允许一个goroutine访问锁定的代码,这意味着对于您的情况,只能执行一个操作,读或写

<>为了更好的效率,你应该考虑使用,因为你可能不希望在被读取的时候锁定地图。来自GoDoc:

RWMutex是读写器互斥锁。锁可以由任意数量的读卡器或单个写入器持有。RWMutex的零值是未锁定的mutex

var mu sync.RWMutex func readMapkey字符串{ 穆尔洛克 延迟mu.RUnlock 返回地图[键] } func updateMapkey,值字符串{ 木锁 延迟mu解锁 yourMap[key]=值 }