티스토리 뷰
Channel 이란?
Go 언어에서 Channel은 Goroutine 간의 통신을 위한 메커니즘이다. 채널은 데이터를 전송하는 파이프 역할을 하며, 고루틴들은 채널을 통해 데이터를 보내고 받을 수 있다.
// a channel that only carries type (ex: int, string)
ic := make(chan type)
Channel은 make 함수를 사용하여 생성할 수 있으며, make (chan type) 형태로 작성한다. 여기서 type은 채널이 전송할 데이터의 타입을 말한다. 만약 int를 넣으면 int 타입의 데이터를 전송할 수 있는 채널을 만들겠다는 의미이다.
ic <- 42 // send 42 to the channel
v := <-ic // get data from the channel
채널은 <- 연산자를 사용하여 데이터를 전송할 수 있다. 예를들어 위와 같이 ic <- 42는 정수형 데이터 42를 채널 ic를 통해 전송하는 코드이다. 또한 v := <- ic는 채널 ic로부터 데이터를 수신하는 코드이다.
채널은 기본적으로 '동기' 방식을 사용해 동작한다.
데이터를 송신한 고루틴은 데이터 수신자가 준비될 때까지 블로킹되며, 데이터를 수신한 고루틴은 송신자가 데이터를 보낼 때까지 블로킹 된다. 이 특성은 채널을 사용하는 고루틴 간의 동기화를 가능하게 해준다.
Channel Example
이제 채널을 이용해 직접 데이터를 송수신 해보자.
package main
import (
"fmt"
)
func SendDataToChannel(ch chan int, value int) {
ch <- value
}
func main() {
var v int
ch := make(chan int) // create channel
go SendDataToChannel(ch, 101)
v = <-ch
fmt.Println(v)
}
위의 샘플 코드는, 고루틴을 통해 데이터를 보내고, 그에 따른 데이터를 받는 코드이다. 결과는 당연하게도 101이 출력된다.
Directional Channel
채널은 단방향일 수 있다. 즉, 채널이 데이터를 보내기만 할 수 있도록 선언할 수 있다.
package main
func f(ch chan<- int, v int) {
ch <- v
}
func main() {
// send-only channel
ch := make(chan<- int)
go f(ch, 42)
go f(ch, 41)
go f(ch, 40)
}
위의 코드는 전송 전용 채널을 생성하고 사용한다. 즉, 데이터를 보낼 수만 있고, 채널에서 데이터를 받으려고 하면 오류가 발생한다.
Channel Close
값이 채널을 통해 전송된 후 채널을 닫도록 만들 수도 있다. close 함수는 이를 수행하고, 채널이 닫혀 있는지 여부를 확인하는 데 사용할 수 있는 boolean 값을 생성한다.
package main
import "fmt"
func SendDataToChannel(ch chan string, s string) {
ch <- s
close(ch)
}
func main() {
ch := make(chan string)
go SendDataToChannel(ch, "Hello World")
// receive the second value as ok
// that determines if the channel is closed or not
v, ok := <-ch
// check if closed
if !ok {
fmt.Println("Channel closed")
}
fmt.Println(v) // Hello World!
}
이런식으로 쓸 수 있다.
Ref :