在 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) } }
在此範例中,一個 Goroutine 會向通道傳送 100 個值,目的是關閉它一旦所有值都已傳送。然而,這種做法引起了人們的擔憂。具體來說:
為了解決這些問題,可以使用sync.WaitGroup 來同步通道的關閉和發送goroutine的完成。
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 Channel?的詳細內容。更多資訊請關注PHP中文網其他相關文章!