> 백엔드 개발 > Golang > 전송된 모든 값이 버퍼링된 후 닫힌 Go 채널에서 값을 검색할 수 있습니까?

전송된 모든 값이 버퍼링된 후 닫힌 Go 채널에서 값을 검색할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-12-07 00:13:10
원래의
838명이 탐색했습니다.

Can Values Be Retrieved from a Closed Go Channel After All Sent Values Have Been Buffered?

닫힌 채널에서 값 검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿