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.
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!