Go by Example: 채널 닫기

채널 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값은 jobsclose되고 채널에 있는 모든 값들이 수신될 경우 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 방법으로 워커를 대기합니다.

	<-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와 자연스럽게 연결됩니다.

다음 예제: 채널에서의 Range.