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
- json
- 책
- 영화
- write
- range
- package
- Python
- go언어
- 리뷰
- Golang
- API
- Linux
- http
- GO 언어
- windows
- Sync
- c++
- File
- bitcoin
- Callback
- tcp
- JavaScript
- mutex
- install
- FOR
- Close
- C
- window
- go
- channel
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 받음
|
출력 결과를 보면 보내기 전에 받은 값들이 있는 것처럼 보일 수 있는데 이는 채널에 값을 넣고 뺀 후 출력하는 부분에서 동기화가 이루어지지 않았기 때문이다.