外部からの 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{} のシグナリング チャネル quit を作成します。このチャネルは、ループを終了するタイミングの信号として機能します。
<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 <-quit: ブロックに分岐し、ループが中断されます。それ以外の場合、デフォルトのケースでは通常どおり反復が実行されます。
<code class="go">myLoop: for { select { case <-quit: break myLoop default: fmt.Println("iteration", i) i++ } }</code>
このソリューションにより、ループの実行を独自のスコープ外から効果的に制御できるようになり、必要に応じて心配することなくループを終了できるようになります。範囲の制限。
以上が外部関数から Go の For ループを抜け出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。