提供されたコードでは、タイムアウト ケースは select ステートメントと time.After() 呼び出しを使用して実装されています。ただし、タイムアウトのケースは実行されません。
この理由は、time.After() 関数が呼び出されるたびに新しいチャネルを作成するためです。 select ステートメントが (最初の for ループで) c1 チャネルから値を受け取ると、既存の time.After() チャネルは破棄されます。したがって、タイムアウトの場合は値を受け取る機会がありません。
この問題を解決するには、for ループの外で time.After() チャネルを 1 回だけ作成します。これにより、実行全体を通じて同じチャネルがタイムアウト ケースに使用されることが保証されます。
変更されたコードは次のとおりです:
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
この変更により、タイムアウト ケースは 2 秒後に正常に実行されます。その時間枠内に c1 チャネルから値が受信されない限り。
以上がチャネルの使用時に Golang タイムアウト ケースがトリガーされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。