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에 값을 전송할 수 있을 때까지 대기하다가, 채널에 들어온 첫 번째 값을 수신해가는 즉시 바로 채널에 값을 전송한다.