yoongrammer

[Go] 채널(Channel) 이란? 본문

언어/Go 언어

[Go] 채널(Channel) 이란?

yoongrammer 2020. 11. 5. 18:10
728x90

목차

 

채널(Channel) 이란?


Go 언어에서 채널은 고루틴을 연결해주는 통로(파이프)입니다.

기본적으로 채널은 양방향이고 고루틴이 아래 이미지와 같이 동일한 채널을 통해 데이터를 보내거나 받을 수 있습니다.

channel in golang

채널 생성


채널은 chan 키워드를 사용하여 만들수 있고 동일한 유형의 데이터만 전송할 수 있습니다.

아래와 같이 make() 함수를 사용하여 채널을 만들 수 있습니다.

channel_name := make(chan Type)

채널 송수신


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

 

<데이터 송신>

myChannel <- data

 

<데이터 수신>

data := <-myChannel

아래와 같이 수신될 변수가 없어도 유효합니다.

<-myChannel

 

728x90

 

채널 닫기


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 <- "to"
    myChannel <- "yoongrammer" 
    
    // 채널 닫음
    close(myChannel)
  } ()
  
  // 값 수신
  for msg := range myChannel {
    fmt.Println(msg)
  }
}

Output:

Wellcome
to
yoongrammer

 

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

그리고 채널은 Unbufferd Channel과 Bufferd Channel 2가지의 채널이 있습니다.

이 내용은 다음에 다루도록 하겠습니다.

728x90

'언어 > Go 언어' 카테고리의 다른 글

gdlv - Go언어 디버거  (0) 2020.11.22
Delve - Go언어 디버거  (0) 2020.11.13
[Go] 채널 방향, 채널 버퍼링, Select  (0) 2020.11.06
고루틴(goroutine) 이란?  (0) 2020.11.04
Go 언어 설치  (0) 2020.11.03
Comments