닫힌 채널에서 값 검색
Go에서 채널을 닫는 것은 향후 가치 전송이 없음을 나타냅니다. 놀랍게도 Go 사양에 수신 작업이 차단 없이 0 값을 반환해야 한다고 명시된 후에도 닫힌 채널에서 값을 검색하는 것이 가능합니다.
이 동작을 이해하기 위해 예제 코드를 자세히 살펴보겠습니다.
package main import ( "fmt" "sync" "time" ) func main() { iCh := make(chan int, 99) var wg sync.WaitGroup go func() { for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() iCh <- i }(i) } // Close the channel once all values are sent wg.Wait() close(iCh) }() // Sleep for 5 seconds, allowing all goroutines to complete time.Sleep(5 * time.Second) print("the channel should be closed by now\n") for i := range iCh { fmt.Printf("%v\n", i) } print("done") }
범위 문 이전에 채널이 닫혀도 여전히 값을 검색하고 인쇄할 수 있습니다. 이는 처음에 채널 버퍼에 이전에 전송된 5개의 값이 포함되어 있었기 때문입니다.
Go 사양
Go 프로그래밍 언어 사양에는 채널을 닫은 후 수신 작업이 반환되어야 한다고 명시되어 있습니다. 차단하지 않고 0 값. 그러나 이는 이전에 전송된 모든 값을 수신한 후에만 적용됩니다. 이 예에서는 이전에 전송된 5개의 값이 채널에 버퍼링되어 있으므로 종료 후에도 검색할 수 있습니다.
기본적으로 make로 생성된 채널의 용량은 0입니다. 즉, 값 블록을 보내는 것을 의미합니다. 수신될 때까지. 우리 예의 경우 채널의 용량은 99이므로 차단 없이 값을 전송할 수 있습니다.
결론
채널을 닫는 동안 부재를 알립니다. 미래 가치 전송의 경우 채널 버퍼를 즉시 비우지 않습니다. 이전에 전송된 값은 채널이 닫혀 있어도 수신 작업을 사용하여 계속 검색할 수 있습니다. 이 동작은 수신 작업에서 반환되는 0 값에 의존하기 전에 모든 값이 수신되었는지 확인하는 것의 중요성을 보여줍니다.
위 내용은 전송된 모든 값이 버퍼링된 후 닫힌 Go 채널에서 값을 검색할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!