더북(TheBook)

5.2.2 버퍼드 채널

채널은 지정한 크기의 버퍼를 가질 수 있다. 채널을 생성할 때 버퍼의 크기를 make의 두 번째 매개변수로 전달하면 버퍼드 채널(buffered channel)을 만들 수 있다.

ch := make(chan int, 100)

버퍼드 채널은 비동기 방식으로 동작한다. 채널이 꽉 찰 때까지 채널로 메시지를 계속 전송할 수 있고, 채널이 빌 때까지 채널로부터 메시지를 계속 수신해 올 수 있다.


package main
 
import "fmt"
 
func main() {
    c := make(chan int, 2)
    c <- 1
    c <- 2
    c <- 3
    fmt.Println(<-c)
    fmt.Println(<-c)
    fmt.Println(<-c)
}

이 코드는 버퍼가 꽉 찼는데도 메시지를 계속 전송해서 다음과 같은 에러가 발생한다.

실행 결과

fatal error: all goroutines are asleep - deadlock!

이 코드를 다음과 같이 수정해 보자.


package mai n
 
import "fmt"
 
func main() {
    c := make(chan int, 2)
    c <- 1
    c <- 2
    go func() { c <- 3 }()
    fmt.Println(<-c)
    fmt.Println(<-c)
    fmt.Println(<-c)
}

채널 c에 세 번째 값을 전송하는 부분을 별도의 고루틴으로 동작시켰다. 고루틴은 채널 c에 값을 전송할 수 있을 때까지 대기하다가, 채널에 들어온 첫 번째 값을 수신해가는 즉시 바로 채널에 값을 전송한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.