了解資料爭用中 Goroutine 的行為
提供的程式碼片段示範了 Go 中的經典資料爭用問題。雖然目標是從欄位清單中列印不同的值(「一」、「二」、「三」),但觀察到的實際結果是「三」列印了三次。
要解決此問題問題,我們需要了解資料爭用發生的原因和地點。
辨識資料爭用
問題在於Goroutine 函數的參數求值。當循環迭代資料切片時,範圍變數 v 被分配給循環體並在對 v.print() 的呼叫中使用。然而, v 變數是元素的副本,並且由於切片在迭代過程中發生了更改,因此 goroutine 最終都指向切片的同一個最後一個元素。
這表示當 goroutine 執行時,它們都列印最後一個值(「三」),而不是我們想要的唯一值(「一」、「二」、「三」)。
可能解決方案
有多種方法可以解決此問題並消除資料爭用:
在循環內建立一個新變數:
使用指標切片:
傳遞切片元素的位址:
使用參數的匿名函數:
透過應用這些解決方案之一,我們可以消除資料競爭並確保goroutine 列印預期的唯一值(“one”、“兩個”、“三個” ),順序不限。
以上是儘管在 Go 中使用了切片,為什麼我的 Goroutines 都列印相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!