Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        
                    | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 29 | 30 | 31 | 
                            Tags
                            
                        
                          
                          - JavaScript
- tcp
- channel
- bitcoin
- Close
- windows
- range
- Golang
- package
- Linux
- json
- Callback
- write
- 영화
- 책
- GO 언어
- File
- window
- C
- Python
- mutex
- API
- go언어
- Sync
- go
- http
- FOR
- install
- c++
- 리뷰
                            Archives
                            
                        
                          
                          - Today
- Total
Code Habit
Go ) channel - range, close 사용 본문
채널에 값이 몇 개나 들어올지 모르기 때문에 값이 들어올 때마다 계속 꺼내기 위해 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  받음 | 
출력 결과를 보면 보내기 전에 받은 값들이 있는 것처럼 보일 수 있는데 이는 채널에 값을 넣고 뺀 후 출력하는 부분에서 동기화가 이루어지지 않았기 때문이다.
