Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menangkap pembolehubah tempatan menggunakan penutupan dalam Goroutine?

Bagaimana untuk menangkap pembolehubah tempatan menggunakan penutupan dalam Goroutine?

WBOY
WBOYasal
2024-06-05 19:40:01429semak imbas

Dalam Goroutine, penutupan boleh digunakan untuk menangkap pembolehubah setempat supaya ia kekal tersedia semasa pelaksanaan Goroutine. Dengan menghantar pembolehubah tempatan sebagai hujah kepada fungsi tanpa nama, anda boleh menangkap pembolehubah apabila goroutine bermula. Dengan menggunakan penutupan, data boleh dikongsi dan diubah suai antara melaksanakan Goroutines secara serentak sambil memastikan keselamatan benang.

如何在 Goroutine 中使用闭包捕获局部变量?

Cara menggunakan penutupan untuk menangkap pembolehubah setempat dalam Goroutine

Penutupan ialah fungsi yang boleh mengakses pembolehubah luaran atau sumber yang sudah wujud apabila ia dicipta. Dalam Go, penutupan dibuat menggunakan fungsi tanpa nama.

Tangkap pembolehubah setempat

Apabila kita memulakan fungsi tanpa nama dalam Goroutine, fungsi itu boleh menangkap semua pembolehubah tempatan yang wujud apabila Goroutine bermula.

Berikut ialah contoh kod cara menangkap pembolehubah setempat:

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)
}

Contoh praktikal

Kita boleh menggunakan penutupan untuk mencipta pembilang yang dilaksanakan secara selari. Setiap Goroutine mempunyai kaunter peribadinya sendiri, yang boleh diakses dengan selamat dan diubah suai serentak:

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)
}

Dengan cara ini, kami mencipta 10 Goroutine secara selari, setiap Goroutine mempunyai kaunter sendiri, dan melakukan 1 juta operasi kenaikan automatik secara serentak. Kami mendapat jumlah kiraan. Oleh kerana setiap Goroutine menangkap pembolehubah kaunter tempatannya sendiri menggunakan penutupan, akses serentak dan pengubahsuaian kaunter adalah selamat untuk benang.

Atas ialah kandungan terperinci Bagaimana untuk menangkap pembolehubah tempatan menggunakan penutupan dalam Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn