首頁  >  文章  >  後端開發  >  如何從外部函數跳出 Go 中的 For 迴圈?

如何從外部函數跳出 Go 中的 For 迴圈?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-27 07:20:28147瀏覽

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

從外部中斷For 循環執行:Go 程式解決方案

在程式設計中,通常需要控制執行流程,特別是在管理循環時。在 Go 中,人們可能會遇到需要從外部來源終止無限 for 迴圈的情況。本文透過提供全面的解決方案來解決此特定場景。

問題描述:

考慮帶有標籤的無限 for 循環,與計畫函數同時運作。目標是當預定函數內滿足特定條件時打破循環。以下是此類嘗試的範例,由於範圍限製而失敗:

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

解決方案:

為了實現此所需的功能,我們採用信令通道。以下是逐步細分:

1.建立一個訊號通道:

我們建立一個 chan struct{} 類型的訊號通道退出。此通道充當循環何時應終止的訊號。

<code class="go">quit := make(chan struct{})

2.關閉訊號中斷通道:

當預定函數內滿足條件時,我們關閉訊號通道。這表示 for 迴圈應該中斷。

<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.檢查通道是否關閉以打破循環:

在 for 迴圈中,我們使用 select 語句從訊號通道讀取資料。當通道關閉(發出中斷訊號)時,執行分支到 case

<code class="go">myLoop:
  for {
    select {
    case <-quit:
      break myLoop
    default:
      fmt.Println("iteration", i)
      i++
    }
  }</code>

此解決方案有效地允許我們從其自身範圍之外控制循環的執行,從而可以在需要時終止循環,而不必擔心範圍限制。

以上是如何從外部函數跳出 Go 中的 For 迴圈?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn