-
채널의 개념
- 채널은 일반 변수를 선언하는 것과 같은 방법을 사용 함(make())
- chan은 채널을 통해 주고받을 데이터의 타입을 지정해 주어야 함
// 채널 변수 선언 후 make() 함수로 채널 생성
var ch chan string
ch = make(chan string)
// make() 함수로 채널 생성 후 바로 변수에 할당
done := make(chan bool)
- 또 한 인터페이스를 사용하면 지정된 데이터 타입과 상관없이 주고 받을 수 있음
-
채널의 주의사항
- 함수와 마찬가지로 채널도 값에 의한 호출 방식으로 값을 전달
- 즉, 실제 값이 복사되어 전달 됨
- 포인터 변수, 참조 값(맵, 슬라이스)을 채널로 전달할 때는 주소 값이 전달됨
- 이때는 여러고루틴에서 한꺼번에 참조값에 접근하는것을 방지하기 위해 mutex를 사용하여 제한해야함
-
송신용 & 수신용 채널
- 채널은 기본적으로 양방향 통신이 가능한 상태로 만들어야 함
- 하지만 실제로는 채널을 구조체 필드로 사용하거나 함수의 매개변수로 전달하는것이 일반적
- 이때는 채널이 대부분 단방향으로만 사용 됨
- 정리하자면, 수신 전용 채널 또는 송신 전용 채널을 선언하여 사용
chan<- string
<- chan string
-
Close & Range
- 채널에 더 이상 전송할 값이 없으면 채널을 닫을 수 있음
close(ch)
- 채널의 수신자는 채널에서 값을 읽을 때 채널이 닫힌 상태인지 아닌지 두 번째 매개변수로 확인할 수 있음
v, ok := <-ch
for i := range ch
- ok의 값이 false라면 채널에 더는 수신할 값이 없고 채널이 닫힌 상태임을 나타냄
- for i := range c는 채널 c가 닫힐 때 까지 반복하며 채널로부터 수신을 시도 함
- 채널을 닫는 것은 필수가 아니며, 수신자가 채널에 더 이상 들어올 필요가 없는 것을 알릴 때 사용
-
Select
- 하나의 고루틴이 여러 채널과 통신할 때 사용함
- case로 여러 채널을 대기시킨 후 실행 가능 상태가 된 채널이 있으면 해당 케이스를 수행
func fibonacci(c, quit chan int) {}