Go - Channel

choko's avatar
Jun 29, 2024
Go - Channel
Contents
go channel
 
notion image

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

Tom의 TIL 정리방