Closing Channels->채널 닫기
#
// 채널 _Closing_은 더 이상 채널에 보낼 데이터가 없음을 나타냅니다.
// 이는 채널의 리시버들에게 완료 상태를 전달하는데에 유용합니다.
package main
import "fmt"
// 이 예제에서 우리는 `main()` 고루틴에서 워커 고루틴으로 작업을 전달하기 위해 `jobs` 채널을 사용합니다.
// 워커에서 돌릴 잡이 더 이상 없을 경우, `jobs` 채널을 `close` 합니다.
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
// 여기에 워커 고루틴 하나가 있습니다. 이는 `j, more := <-jobs`을 통해 `jobs`로부터 반복적으로 값을 수신합니다.
// 이 두 값을 반환하는 특별한 형태의 수신값에서, `more`값은 `jobs`가 `close`되고 채널에 있는 모든 값들이 수신될 경우 `false`값을 갖게됩니다.
// 모든 잡이 종료되었음을 알리기 위해 `done`을 사용합니다.
go func() {
for {
j, more := <-jobs
if more {
fmt.Println("received job", j)
} else {
fmt.Println("received all jobs")
done <- true
return
}
}
}()
// `jobs` 채널을 통해 워커로 3개의 잡을 보낸 후, 채널을 닫습니다.
for j := 1; j <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
// 이전에 봤던 [synchronization](/gobyexample/channel-synchronization) 방법으로 워커를 대기합니다.
<-done
}
$ go run closing-channels.go
sent job 1
received job 1
sent job 2
received job 2
sent job 3
received job 3
sent all jobs
received all jobs
# 닫힌 채널의 아이디어는 다음 예제인 채널에서의 `range`와 자연스럽게 연결됩니다.