카테고리 없음
Go ) channel
코드베어
2020. 6. 9. 08:40
채널은 고루틴끼리 데이터를 주고받고, 실행 흐름을 제어하는 기능이다. 모든 타입은 채널로 사용할 수 있다. 그리고 채널 자체는 값이 아닌 레퍼런스 타입이다.
채널은 다음과 같이 공간을 할당 후 사용해야 한다. 이렇게 생성하면 동기 채널( synchronous channel )이 생성된다.
- make(chan 자료형)
채널은 다음과 같이 사용한다.
- 채널 <- : 채널에 값을 보낸다.
- <- 채널 : 채널에 값이 들어올 때가지 기다린 뒤 값이 들어오면 값을 가져오고 다음 코드를 실행한다.
고루틴과 채널을 사용하여 두 정수 값을 더해보겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package main
import "fmt"
func sum(a int, b int, c chan int) {
c <- a + b // 채널에 a와 b의 합을 보냄
}
func main() {
c := make(chan int) // int형 채널 생성
go sum(1, 2, c) // sum을 고루틴으로 실행한 뒤 채널을 매개변수로 넘겨줌
n := <-c // 채널에 값이 들어올 때까지 대기
fmt.Println(n) // 3
}
|
채널을 매개변수로 받는 함수는 반드시 go 키워드를 사용하여 고루틴으로 실행해야 한다.
동기 채널은 보내는 쪽에서는 값을 받을 때까지 대기하고, 받는 쪽에서는 채널에 값이 들어올 때까지 대기한다.