在Go 中使用「範圍」並發存取地圖
Go 部落格文章「行動中的地圖」同時強調了同步的重要性同時強調了同步的重要性同時訪問地圖。然而,目前尚不清楚使用 range 關鍵字迭代映射是否構成「讀取」或「週轉」階段,以及在此過程中是否允許並發存取。
對 for 迴圈中的範圍表達式進行求值在迴圈開始前一次。這意味著映射值僅被訪問一次,對映射進行的任何後續修改都不會反映在迭代中。因此,只要在迭代映射時不修改映射本身,並發存取就是安全的。
為了確保執行緒安全,應該在進入循環之前對映射進行讀取鎖定,並在每次迭代後解鎖。這可以防止並發 goroutine 在此期間修改映射。下面的程式碼示範了這種技術:
func IterateMapKeys(iteratorChannel chan int) error { testMapLock.RLock() defer testMapLock.RUnlock() for k, v := range testMap { testMapLock.RUnlock() someFunc() testMapLock.RLock() if someCond { return someErr } } return nil }
在持有寫鎖的同時修改不同 goroutine 中的映射可確保安全修改以及循環迭代器對更改的後續觀察。
但是,需要注意的是,這種鎖定機制只能防止並發訪問,而不能防止並發修改。並發修改仍然可以發生,但不會影響當前迭代。
以上是在 `range` 迭代期間並發存取 Go Maps 安全性嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!