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