채널 사용하기


이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07



range와 close 사용하기

이번에는 range 키워드와 close 함수에 대해 알아보겠습니다. 다음은 0부터 4까지 채널에 값을 보내고, 다시 채널에서 값을 꺼내서 출력합니다.

package main

import "fmt"

func main() {
	c := make(chan int) // int형 채널을 생성

	go func() {
		for i := 0; i < 5; i++ {
			c <- i // 채널에 값을 보냄
		}
		close(c)       // 채널을 닫음
	}()

	for i := range c { // range를 사용하여 채널에서 값을 꺼냄
		fmt.Println(i) // 꺼낸 값을 출력
	}
}

실행 결과

0
1
2
3
4

for 반복문 안에서 range 키워드를 사용하면 채널이 닫힐 때까지 반복하면서 값을 꺼냅니다. 여기서는 동시에 고루틴 안에서 채널 c에 0부터 4까지 값을 보낸 뒤 close를 사용하여 채널을 닫습니다. 이렇게 하면 range로 0부터 4까지 꺼내고, 값을 출력한 뒤 반복문이 종료됩니다.

다음은 rangeclose 함수의 특징입니다.

  • 이미 닫힌 채널에 값을 보내면 패닉이 발생합니다.
  • 채널을 닫으면 range 루프가 종료됩니다.
  • 채널이 열려있고, 값이 들어오지 않는다면 range는 실행되지 않고 계속 대기합니다. 만약 다른 곳에서 채널에 값을 보냈다면(채널에 값이 들어오면) 그때부터 range가 계속 반복됩니다.

정리하자면 range는 채널에 값이 몇 개나 들어올지 모르기 때문에 값이 들어올 때마다 계속 꺼내기 위해 사용합니다.

채널을 가져온 뒤 두 번째 리턴값으로 채널이 닫혔는지 확인할 수 있습니다.

c := make(chan int, 1)

go func() {
	c <- 1
}()

a, ok := <-c       // 채널이 닫혔는지 확인
fmt.Println(a, ok) // 1 true: 채널은 열려 있고 1을 꺼냄

close(c)           // 채널을 닫음
a, ok = <-c        // 채널이 닫혔는지 확인
fmt.Println(a, ok) // 0 false: 채널이 닫혔음

두 번째 매개변수가 true이면 채널이 열린 상태이고, false이면 채널이 닫힌 상태입니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015