단방향 채널을 양뱡향 채널 파라미터로 전달하거나 송(수)신 채널을 수(송)신 채널 파라미터로 넘기면 컴파일 에러 발생
송신
chan <- int
수신
<-chan int
닫기
close 함수 사용
호출 이후 송신은 불가능, 수신은 가능
채널이 닫힐 떄까지 수신하는 방법
방법 1
for {
if data, ok := <-channel; ok {
log.Println("receive data : ", data)
} else {
break
}
}
방법 2
for data := range channel {
log.Println("receive data : ", data)
}
select
n개의 채널을 수신 대기
switch문과 유사하게 case/default문 등을 사용
준비된 채널이 없을 경우 default문이 없으면 대기, 있으면 default문 수행
대기 그룹(WaitGroup)
고루틴들의 대기에 사용
Add
대기 수 증가
Done
대기 수 감소
Wait
대기 수가 0이 될 때까지 대기
예제
코드
packagemainimport("log""sync""time")funcbufferingJob(channelchanint,dataCountint){wgSend:=sync.WaitGroup{}fori:=0;i<dataCount;i++{wgSend.Add(1)gofunc(channelchanint,wg*sync.WaitGroup,dataint){deferwg.Done()channel<-datalog.Println("send data : ",data)}(channel,&wgSend,i)}time.Sleep(time.Second)wgReceive:=sync.WaitGroup{}wgReceive.Add(1)gofunc(channelchanint,wg*sync.WaitGroup){deferwg.Done()/*
for {
if data, ok := <-channel; ok {
log.Println("receive data : ", data)
} else {
break
}
}
*/fordata:=rangechannel{log.Println("receive data : ",data)}}(channel,&wgReceive)wgSend.Wait()close(channel)wgReceive.Wait()}funcunbufferedChannelTest(){channel:=make(chanint)bufferingJob(channel,3)}funcbufferedChannelTest(){channel:=make(chanint,3)bufferingJob(channel,5)}funcdirectionsTest(){channel:=make(chanint,1)func(channelchan<-int){channel<-1}(channel)func(channel<-chanint){println(<-channel)}(channel)}funcselectTest(){channel1:=make(chanint)channel2:=make(chanbool)gofunc(){count:=0EXIT:for{select{casedata:=<-channel1:println(data)casedata:=<-channel2:println(data)breakEXITdefault:count++}}println("default call : ",count)}()channel1<-1channel1<-2channel2<-true}funcmain(){unbufferedChannelTest()println("------")bufferedChannelTest()println("------")directionsTest()println("------")selectTest()}
실행 결과
2022/12/14 02:16:27 receive data : 0
2022/12/14 02:16:27 receive data : 1
2022/12/14 02:16:27 receive data : 2
2022/12/14 02:16:27 send data : 2
2022/12/14 02:16:27 send data : 0
2022/12/14 02:16:27 send data : 1
------
2022/12/14 02:16:27 send data : 4
2022/12/14 02:16:27 send data : 0
2022/12/14 02:16:27 send data : 1
2022/12/14 02:16:28 send data : 2
2022/12/14 02:16:28 receive data : 4
2022/12/14 02:16:28 receive data : 0
2022/12/14 02:16:28 receive data : 1
2022/12/14 02:16:28 receive data : 2
2022/12/14 02:16:28 receive data : 3
2022/12/14 02:16:28 send data : 3
------
1
------
1
2
true
default call : 256
개요
사이트
오픈소스 실시간 메시징 서버
Centrifuge(Go) 라이브러리를 기반으로 구축
다양한 실시간 전송(WebSocket, HTTP-streaming, SSE/EventSource, WebTransport, GRPC)을 통해 연결된 애플리케이션 온라인 사...