Contents
go channel
go channel
- channel은 go routine간의 메세지를 주고받을 수 있는 메세지 큐이다.
- 사용법
- 생성 (
make (chan T)
) var messages chan string = make(chan string)
- 채널에 데이터 넣기
messages <- "This is a message”
- 채널에서 데이터 가져오기(빼기)
var msg string = <- messages
- 채널 인스턴스에 데이터가 없다면, 데이터가 들어올 때까지 대기한다.
- 채널 닫기
close(messages)
- 채널을 닫으면 송신은 불가능하지만 수신은 계속할 수 있다.
- 채널의 크기
- 채널의 기본 크기는 0이다. 채널을 생성할 때 버퍼의 크기(채널의 크기)를 설정해준다.
varchanstring messages = make(chanstring, 2)
- 이 채널은 데이터를 2개까지 보관할 수 있다.
- 하지만 버퍼가 다 차면, 채널에 빈자리가 생길 때까지 대기한다. 따라서 데이터를 제때 빼가지 않으면, 고루틴이 멈추게 된다.
- select문으로 여러 채널 관리하기
- 다음과 같이 여러개의 채널과 select문을 통해 결과를 분기할 수 있다.
- select문은 하나의 case만 처리되면 종료되기 때문에, 계속 채널 데이터를 수신하며 처리하고 싶다면 for 문으로 감싸 사용하면 된다.
Chan1 := make(chan string)
Chan2 := make(chan string)
Chanerr := make(chan error)
go doSomeThing(Chan1,Chan2, Chanerr)
// for {
select {
case Chan1Result := <-Chan1:
// do something with result of chan1
case Chan2Result := <-Chan2:
// do something with result of chan2
case caseErr := <-Chanerr:
// err handling
case <-time.After(time.Minute * 2):
// timeout err return
}
// }
Share article