Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Saya Boleh Melepaskan For Gelung dalam Go daripada Fungsi Luaran?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 07:20:28147semak imbas

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

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!

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