首頁 > 後端開發 > Golang > 儘管在 Go 中使用了切片,為什麼我的 Goroutines 都列印相同的值?

儘管在 Go 中使用了切片,為什麼我的 Goroutines 都列印相同的值?

Susan Sarandon
發布: 2024-12-20 02:40:10
原創
806 人瀏覽過

Why Do My Goroutines All Print the Same Value Despite Using a Slice in Go?

了解資料爭用中 Goroutine 的行為

提供的程式碼片段示範了 Go 中的經典資料爭用問題。雖然目標是從欄位清單中列印不同的值(「一」、「二」、「三」),但觀察到的實際結果是「三」列印了三次。

要解決此問題問題,我們需要了解資料爭用發生的原因和地點。

辨識資料爭用

問題在於Goroutine 函數的參數求值。當循環迭代資料切片時,範圍變數 v 被分配給循環體並在對 v.print() 的呼叫中使用。然而, v 變數是元素的副本,並且由於切片在迭代過程中發生了更改,因此 goroutine 最終都指向切片的同一個最後一個元素。

這表示當 goroutine 執行時,它們都列印最後一個值(「三」),而不是我們想要的唯一值(「一」、「二」、「三」)。

可能解決方案

有多種方法可以解決此問題並消除資料爭用:

  1. 在循環內建立一個新變數:

    • 透過使用 v := v 語法在循環中宣告一個新變數 v,我們確保每個 goroutine 都對自己的資料副本進行操作。
  2. 使用指標切片:

    • 而不是傳遞原始切片,我們可以使用指針切片(例如,[] *field)。當傳遞給 goroutine 時,每個指標都指向切片中的唯一元素,從而避免了資料競爭。
  3. 傳遞切片元素的位址:

    • 或者,我們可以使用以下方法明確地將每個切片元素的地址傳遞給goroutine語法&資料[i]。這確保每個 goroutine 都有一個指向預期元素的唯一指標。
  4. 使用參數的匿名函數:

    • 如果goroutine函數位於匿名函數內,我們可以將range變數變數作為參數傳遞給匿名函數,從而隔離goroutine 對資料的存取。

透過應用這些解決方案之一,我們可以消除資料競爭並確保goroutine 列印預期的唯一值(“one”、“兩個”、“三個” ),順序不限。

以上是儘管在 Go 中使用了切片,為什麼我的 Goroutines 都列印相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板