首頁 >後端開發 >Golang >如何在 Goroutine 中使用閉包捕捉局部變數?

如何在 Goroutine 中使用閉包捕捉局部變數?

WBOY
WBOY原創
2024-06-05 19:40:01489瀏覽

在 Goroutine 中,閉包可用於捕獲局部變量,使其在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn