저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
채널 사용하기
이재홍 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까지 꺼내고, 값을 출력한 뒤 반복문이 종료됩니다.
다음은 range와 close 함수의 특징입니다.
- 이미 닫힌 채널에 값을 보내면 패닉이 발생합니다.
- 채널을 닫으면 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 공유는 허용합니다.