在先前的範例中,我們使用明確的鎖定 互斥鎖,以同步多個 goroutine 存取共用狀態。另一種選擇是使用 goroutine 和通道的內建同步功能來達成相同的結果。這種基於通道的方式符合 Go 的記憶體分享觀念,透過溝通來分享記憶體,並且每一份資料都正由一個 goroutine 擁有著。 |
|
![]() ![]()
|
|
|
|
在此範例中,我們的狀態將由一個 goroutine 擁有。這將保證資料不會在同時存取時損毀。若要讀取或寫入該狀態,其他 goroutine 會將訊息傳送給擁有的 goroutine,並收到對應的回覆。這些 |
|
|
|
和先前一樣,我們將計算執行的操作次數。 |
|
|
|
這是擁有 |
|
這會啟動 100 個 goroutine,以透過 |
|
我們也會以類似的做法啟動 10 個寫入。 |
|
讓這些 goroutine 執行一秒。 |
|
最後,擷取並回報操作次數。 |
|
執行我們的程式會顯示,這是基於 goroutine 的狀態管理範例,總共完成了約 80,000 項操作。 |
|
對於此特定狀況來說,基於 goroutine 的方式會比基於互斥鎖的方式複雜一點。但在某些狀況下它可能會很有用,例如處理其他相關通道的狀況,或管理多個互斥鎖容易出錯時。您應使用覺得最直覺的方式,特別是在了解程式的正確性的方面。 |
下一個範例:排序。