Go by Example: [23] Channels

Channels

채널(Channels)은 동시 실행중인 두개의 고루틴사이에 연결된 통신용 파이프라고 생각하시면 됩니다.
특정값을 채널을 통해서 동시 실행중인 고루틴간에 데이터를 주거나 받을수 있는 데이터 교환을 할 수 있습니다.

package main

import "fmt"

func main() {
    
    messages := make(chan string)          // [1]
    
    go func() { message <- "ping" }()      // [2]
    
    msg := <-messages                      // [3]
    fmt.Println(msg)
}
  1. make(chan value-type)구문을 이용해서 통신용 채널을 생성합니다.
  2. 채널을 통해서 데이터를 전송하려면 channel <- 형식으로 사용합니다.
    여기서는 ping이라는 문자열을 message채널에 고루틴에서 전송하고 있습니다.
  3. <-channel형식으로 채널에서 데이터를 전송받을 수 있습니다. 전송받은 데이터를 출력하고 있습니다.

채널을 통해서 고루틴에서 다른 고루틴으로 데이터를 주고 받을 수 있게된 것입니다.
예제에서는 “ping”이라는 문자열을 주고 받고 있습니다.
참고로, main()함수도 고루틴입니다.!! ( f() <- messages -> main() 구조입니다 )

실행하면 다음과 같습니다.

$ go run channels.go 
ping

기본적으로 채널은 주거나 받을때까지 블럭상태에 빠지도록 되어있습니다. 즉, 채널에 “ping”이라는 메세지를 제대로 전송한 후, 수신할때가지 대기하는 기능을 하는
동기화를 제공하는 것입니다.