Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Code Habit

Go ) channel - range, close 사용 본문

카테고리 없음

Go ) channel - range, close 사용

코드베어 2020. 6. 9. 14:25

채널에 값이 몇 개나 들어올지 모르기 때문에 값이 들어올 때마다 계속 꺼내기 위해 range를 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
 
import (
    "fmt"
    "runtime"
)
 
func main() {
    runtime.GOMAXPROCS(1)
 
   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)    // 꺼낸 값을 출력
    } 
}

 

range와 close 함수의 특징이다.

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

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

 

실행 결과

0  보냄
0  받음
1  받음
1  보냄
2  보냄
2  받음
3  받음
3  보냄
4  보냄
4  받음

출력 결과를 보면 보내기 전에 받은 값들이 있는 것처럼 보일 수 있는데 이는 채널에 값을 넣고 뺀 후 출력하는 부분에서 동기화가 이루어지지 않았기 때문이다.