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