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을 사용하여 전송 고루틴 완료와 채널 폐쇄를 동기화할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!