從外部中斷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中文網其他相關文章!