GO언어 - Channel

채널(Channel) 이란?

Go 언어에서 채널은 고루틴을 연결해주는 통로(파이프)이다.
기본적으로 채널은 양방향이고 고루틴이 아래 이미지와 같이 동일한 채널을 통해 데이터를 보내거나 받을 수 있다.
image

채널 생성

채널은 chan 키워드를 사용하여 만들수 있고 동일한 유형의 데이터만 전송할 수 있는데, make() 함수를 사용하여 채널을 만들 수 있다.

channel_name := make(chan Type)


채널 송수신

<- 연산자의 방향은 데이터 수신 또는 송신 여부를 나타낸다.

[데이터 송신]

myChannel <- data

[데이터 수신]

data := <-myChannel

아니면 이렇게 표현 가능하다.

<-myChannel

이처럼 수신될 변수가 없어도 유효하다.

채널 닫기

close() 함수를 사용하여 채널을 닫을 수 있다. 채널을 닫으면, 해당 채널로는 더 이상 송신을 할 수 없지만 채널에 데이터가 있으면 수신은 가능하다.

close(myChannel)

이 형태를 이용하면 채널이 열려 있는지 닫혀 있는지 확인할 수 있다.

data, ok := <-myChannel

여기서 ok값이 ture이면 채널이 열려있다는 의미이고 false면 닫혀 있다는 의미이다.

또한, for range 문을 사용하여 채널이 닫힐 때까지 데이터를 수신할 수 있다.

for item := range myChannel {
  ...
}

채널이 열려 있다면 range는 채널에 값이 들어올 때까지 대기를 하게 되고, 채널이 닫히면 range 루프가 종료된다.

지금까지 배운 내용을 활용해보자.

package main

import "fmt"

func main() {
  // 채널 생성
  myChannel := make(chan string)
  
  go func() { 
    // 값 전달
    myChannel <- "Wellcome"
    myChannel <- "user"
    
    // 채널 닫음
    close(myChannel)
  } ()
  
  // 값 수신
  for msg := range myChannel {
    fmt.Println(msg)
  }
}

출력:

Wellcome
user

채널은 기본적으로 양방향 채널이지만 단방향 채널로도 사용할 수 있다.

Categories:

Updated:

Comments