在 Goroutine 中,閉包可用於捕獲局部變量,使其在 Goroutine 執行期間仍然可用。透過將局部變數作為匿名函數的參數傳遞,可以在 Goroutine 啟動時擷取該變數。透過使用閉包,可以在並發執行的 Goroutine 之間共享和修改數據,同時確保線程安全。
如何在Goroutine 中使用閉包捕獲局部變數
閉包是一個函數,它可以存取在其建立時就已經存在的外部變數或資源。在 Go 中,閉包是透過使用匿名函數來建立。
擷取局部變數
當我們在 Goroutine 中啟動匿名函數時,函數可以捕捉 Goroutine 啟動時存在的所有局部變數。
以下是如何擷取局部變數的程式碼範例:
package main import ( "fmt" "time" ) func main() { i := 0 for i < 10 { go func(i int) { fmt.Println(i) }(i) i++ } time.Sleep(time.Second) }
實戰案例
我們可以使用閉包來建立一個並行執行的計數器。每個Goroutine 都有自己的私有計數器,可以安全地並發存取和修改:
package main import ( "fmt" "sync" "sync/atomic" "time" ) func main() { var wg sync.WaitGroup var counter uint64 for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { defer wg.Done() for j := 0; j < 1000000; j++ { // 使用原子操作确保并发安全 atomic.AddUint64(&counter, 1) } fmt.Println("Goroutine", i, "finished") }(i) } wg.Wait() fmt.Println("Total count:", counter) }
這樣,我們並行創建了10 個Goroutine,每個Goroutine 都有自己的計數器,並發執行100 萬次自增操作,最後我們得到了總計數。由於每個 Goroutine 都使用閉包捕獲了自己的局部計數器變量,因此並發存取和修改計數器是線程安全的。
以上是如何在 Goroutine 中使用閉包捕捉局部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!