在 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中文网其他相关文章!