티스토리 뷰

카테고리 없음

[Go] Channel

뱃싸공 2023. 3. 18. 15:41
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 : 

 

Channels in Golang - Golang Docs

Channels are a medium that the goroutines use in order to communicate effectively. It is the most important concept to grasp after understanding how

golangdocs.com

 

 

동시성 · Effective Go in Korean

 

gosudaweb.gitbooks.io

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함