채널(Channel) 이란?
Go 언어에서 채널은 고루틴을 연결해주는 통로(파이프)입니다.
기본적으로 채널은 양방향이고 고루틴이 아래 이미지와 같이 동일한 채널을 통해 데이터를 보내거나 받을 수 있습니다.
채널 생성
채널은 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가지의 채널이 있습니다.
이 내용은 다음에 다루도록 하겠습니다.