Go でチャネルを操作する場合、チャネルを閉じる適切な時間を決定することが重要です。これは、チャネルの長さが不明な場合に問題になります。
次のシナリオを考えてみましょう:
package main import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { for i := 0; i < 100; i++ { ch <- i } close(ch) }() for v := range ch { fmt.Println(v) } }
この例では、ゴルーチンは、チャネルを閉じることを目的として、チャネルに 100 個の値を送信します。すべての値が送信されたら。ただし、このアプローチには懸念が生じます。具体的には:
これらの問題に対処するには、sync.WaitGroup を使用して、チャネルの終了と送信ゴルーチンの完了を同期させることができます。
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup ch := make(chan int) wg.Add(1) // Increment counter for sender goroutine go func() { defer wg.Done() // Decrement counter when goroutine completes for i := 0; i < 100; i++ { ch <- i } close(ch) }() go func() { wg.Wait() // Wait until the sender goroutine completes close(ch) // Close the channel after all values have been sent }() for v := range ch { fmt.Println(v) } }
以上が長さが不明な Go チャネルを正常に閉じるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。