Bagaimanakah Saya Boleh Melepaskan For Gelung dalam Go daripada Fungsi Luaran?

Mary-Kate Olsen
Lepaskan: 2024-10-27 07:20:28
asal
164 orang telah melayarinya

How Can I Break Out of a For Loop in Go from an External Function?

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")
}
Salin selepas log masuk

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{})
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!