Memecahkan Pelaksanaan Untuk Gelung dari Luar: Penyelesaian Pengaturcaraan Go
Dalam pengaturcaraan, selalunya perlu untuk mengawal aliran pelaksanaan , terutamanya apabila menguruskan gelung. Dalam Go, seseorang mungkin menghadapi situasi di mana gelung infinite for perlu ditamatkan daripada sumber luaran. Artikel ini menangani senario khusus ini dengan menyediakan penyelesaian yang komprehensif.
Penerangan Masalah:
Pertimbangkan gelung tak terhingga dengan label, berjalan serentak dengan fungsi berjadual. Matlamatnya adalah untuk memecahkan gelung apabila syarat tertentu dipenuhi dari dalam fungsi yang dijadualkan. Di bawah ialah contoh percubaan sedemikian, yang gagal kerana had skop:
<code class="go">package main import ( "fmt" "sync" "time" ) func main() { count := 0 var wg sync.WaitGroup wg.Add(1) t := time.NewTicker(time.Second * 1) go func() { for { fmt.Println("I will print every second", count) count++ if count > 5 { break myLoop; // Issue due to scope error: 'myLoop' not visible wg.Done() } <-t.C } }() i := 1 myLoop: for { fmt.Println("iteration", i) i++ } wg.Wait() fmt.Println("I will execute at the end") }
Penyelesaian:
Untuk mencapai kefungsian yang diingini ini, kami menggunakan saluran isyarat . Berikut ialah pecahan langkah demi langkah:
1. Cipta Saluran Isyarat:
Kami mencipta saluran isyarat keluar dari jenis chan struct{}. Saluran ini bertindak sebagai isyarat bila gelung harus ditamatkan.
<code class="go">quit := make(chan struct{})
2. Tutup Saluran kepada Pemutusan Isyarat:
Apabila syarat dipenuhi dalam fungsi yang dijadualkan, kami menutup saluran isyarat. Ini menunjukkan bahawa gelung for harus putus.
<code class="go">go func() { for { fmt.Println("I will print every second", count) count++ if count > 5 { close(quit) wg.Done() return } <-t.C } }()</code>
3. Semak Penutupan Saluran untuk Memecah Gelung:
Dalam gelung for, kita membaca daripada saluran isyarat menggunakan pernyataan pilih. Apabila saluran ditutup (memberi isyarat rehat), pelaksanaan bercabang kepada kes <-quit: sekat, memecahkan gelung. Jika tidak, kes lalai melaksanakan lelaran seperti biasa.
<code class="go">myLoop: for { select { case <-quit: break myLoop default: fmt.Println("iteration", i) i++ } }</code>
Penyelesaian ini dengan berkesan membolehkan kami mengawal pelaksanaan gelung dari luar skopnya sendiri, menjadikannya mungkin untuk menamatkan gelung apabila dikehendaki tanpa perlu risau tentang had skop.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melepaskan For Gelung dalam Go daripada Fungsi Luaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!