채널이 버퍼링되면 버퍼가 가득 찼을 때까지 차단되지 않습니다. 버퍼가 가득 차면, 전송 고로 틴은 채널에 물건을 추가하려고 시도 할 때 차단됩니다.
이것은 이것이 차단 될 것임을 의미합니다.
c := make(chan int)
c <- 1 // Block here, this is unbuffered !
println(<-c)
그리고 이것은 할 것입니다 또한 차단하다:
c := make(chan int, 2)
c <- 1
c <- 2
c <- 3 // Block here, buffer is full !
println(<-c)
하지만 가리키다 Goroutines와 채널 중 동시에 물건을 실행하는 것이 정확히 작동하므로 다음과 같습니다.
c := make(chan int)
go func() { c <- 1; }() // This will block in the spawned goroutine until...
println(<-c) // ... this line is reached in the main goroutine
그리고 마찬가지로 :
c := make(chan int, 2)
go func() { // `go ...` spawns a goroutine
c <- 1 // Buffer is not full, no block
c <- 2 // Buffer is not full, no block
c <- 3 // Buffer is full, spawned goroutine is blocking until...
}()
println(<-c) // ... this line is reached in the main goroutine
예에서, 당신은 4 개의 다른 goroutines를 생성하는데, 이들은 모두 동일한 버퍼링 된 채널에 4 개의 숫자를 씁니다. 버퍼가 2 <16이므로 결국 차단됩니다.
그러나이 문제의 요점은 GO 정책이 메인 고 루틴 만 기다리십시오:
프로그램 실행은 기본 패키지를 초기화 한 다음 함수 메인을 호출하여 시작합니다. 함수가 메인을 반환하면 프로그램이 종료됩니다. 다른 (메인이 아닌) 고어 라틴이 완료되기를 기다리지 않습니다.
이것은 첫 번째 예에서 기본 Goroutine은 라인에 도달했을 때 차단되었습니다 c <- 3
. 다른 Goroutine이 잠재적으로 차단 해제 할 수있는 일을 할 수 없었기 때문에 런타임은 프로그램이 교착 상태가되어 오류를보고했음을 감지했습니다.
그러나 두 번째 예에서는 산란 Goroutines 블록이 차단되는 반면, 메인은 실행의 끝에 도달 할 때까지 조용히 계속됩니다.