DevOps/GoLang

[Golang] Channel

WhiteDuck 2023. 9. 3. 17:12

- 본 글은 2023.09.03 에 작성된 포스트입니다

Channel


Channel 은 데이터를 주고 받을 수 있습니다. 주로 Goroutine 에서 스레드간 통신을 위한 매개체로 사용되기도 합니다. Go 에서 채널을 사용한다면 다음과 같은 키워드로 생성, 삭제, 읽기, 쓰기 작업을 수행할 수 있습니다.

  • make(chan {type}, {int}) : 채널을 생성
    • type : 채널에서 다룰 데이터 형식
    • int: 버퍼의 개수, default 는 0이며, 버퍼의 개수만큼 지연없이 입력을 할 수 있습니다. 버퍼가 가득차면, 버퍼에서 출력할때까지 입력을 대기합니다.
  • <- : 채널의 입/출력 연산자, 채널이 연산자의 왼쪽에 있으면 입력, 오른쪽에 있으면 출력
  • close : 채널 닫기
  • range : 채널이 닫히고 버퍼의 데이터가 다 소모될 때까지 루프를 돌 수 있습니다.
  • select : 복수의 채널을 실행, case 문으로 채널을 구분하고, 수신되는 채널이 없고 default 가 있다면 default 를 실행합니다.


예제를 통한 Channel 알아보기


다음은 하나의 버퍼를 가진 채널에 두 번씩 데이터를 보내지만, 버퍼가 가득차면 한번씩 채널을 실행하게 되는 예제를 보여줍니다.




world
world
Hello world
world
Hello world
world
Hello world
world
Hello world
Hello world

채널과 채널의 버퍼가 어떻게 쓰이는 지 알아보았는데, 다음은 range 도 어떻게 쓰이는 지 알아봅시다.
아래 예제에서는 고루틴을 Go 런타임에서 대기할 필요가 없어 WaitGroups 를 지정하지 않았습니다.




world
Hello world
world
Hello world
world
Hello world
world
Hello world
world
Hello world

마지막으로 select 의 예제를 살펴봅시다. select 는 앞에서 얘기했듯이 다중 채널을 다룰 수 있습니다.




I'm say
I'm say2
I'm say
I'm say
I'm say2
I'm say
I'm say
I'm say2
I'm say2
I'm say2


참고


select : https://hamait.tistory.com/1017
for : http://golang.site/go/article/8-Go-%EB%B0%98%EB%B3%B5%EB%AC%B8
channel : http://golang.site/go/article/22-Go-%EC%B1%84%EB%84%90

반응형

'DevOps > GoLang' 카테고리의 다른 글

[Golang] Goroutine (고루틴)  (0) 2023.09.03