ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Golang] Go 의 range 와 channel 함께 사용하기
    Golang 2024. 6. 15. 17:58
    728x90
    반응형

     

    - 목차

     

    들어가며.

    Go 언어는 channelrange 를 함께 사용하여 데이터를 효율적으로 처리할 수 있는 간단하고 강력한 메커니즘을 제공합니다.

    특히, 고루틴(goroutine)과 함께 사용할 때 데이터의 동시성 처리를 쉽게 구현할 수 있습니다.

     

    Channel.

    Go 의 채널은 고루틴 간의 통신을 위한 도구로, 데이터를 전송하거나 수신할 때 사용됩니다.

    주로 아래와 같은 방식으로 Channel 변수를 초기화할 수 있습니다.

     

    ch := make(chan int)

     

    Range.

     

    range 는 슬라이스, 배열, 맵, 채널 등에서 데이터를 순회(iterate)하는 데 사용됩니다.

    채널에서 range를 사용하면 채널이 닫힐 때까지 데이터를 자동으로 수신합니다.

    golang 에서는 채널을 닫기 위한 close 함수가 built in function 으로 제공됩니다.

     

    ch := make(chan int)
    
    close(ch)

     

     

    Range + Channel 조합해보기.

    range 키워드는 Complex 자료구조를 순회할 수 있으며, Channel 과 함께 사용되어 Channel 내부를 순회합니다.

    하지만 Channel 은 그 특성 상 외부 goroutine 에서 데이터를 언제든지 추가하거나 소비할 수 있기 때문에 Unbounded Queue 의 형태로 존재합니다.

    즉, Endless 형태도 데이터의 끝이 없는 구조이죠.

    따라서 close(ch) 와 같이 Channel 의 끝을 명시해주지 않으면 range channel 의 반복문은 종료되지 않고 계속 실행됩니다.

     

     

    아래의 예시는 int 타입의 chan 에 5개의 데이터를 추가하고, 10초 이후에 Channel 이 종료됩니다.

    그리고 이 range chan 반복문은 종료되기까지의 10초간 실행됩니다.

     

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	start := time.Now()
    
    	ch := make(chan int)
    
    	go func() {
    		for i := 1; i <= 5; i++ {
    			ch <- i
    		}
    		time.Sleep(10 * time.Second)
    		close(ch)
    	}()
    
    	for val := range ch {
    		fmt.Println(val)
    	}
    	fmt.Printf("just Finished. time consumed: %2.ds \n",
    		int(time.Now().Sub(start).Seconds()))
    }
    1
    2
    3
    4
    5
    just Finished. time consumed: 10s

     

     

    반응형
Designed by Tistory.