Go by Example: [31] Range Over Channels

Range Over Channels

forrange 장에서 기본적인 데이터 구조에서 요소를 반복적으로 나열해서 처리하는 것을
배웠었습니다. 이제는 같은 기술을 채널에서 사용하는 방법에 대해서 설명하겠습니다.

package main

import "fmt"

func main() {
    
    queue := make(chan string, 2)       // [1]
    queue <- "one"
    queue <- "two"
    close(queue)
    
    for elem := range queue {           // [2]
        fmt.Println(elem)
    }
}
  1. queue채널에 2개의 메세지를 전송한 후 채널을 종료합니다.
  2. range문은 일반적인 데이터구조를 나열할 수도 있지만, 채널의 데이터를 나열할 수도 있습니다.
    예제에서는 queue채널의 모든 데이터를 열거합니다. 하지만, 채널에 2개의 메세지를 전송후 곧바로
    채널을 종료해버렸기 때문에, 2개의 메세지만 받아서 처리한 후에 종료되게 됩니다.(동기채널)
    만약, close로 채널을 종료하지 않았다면 3번째 메세지가 올때까지 블럭상태에 빠지게 됩니다.

실행하면 다음과 같습니다.

$ go run range-over-channels.go
one
two

본 예제에서는 비어있지 않는 종료된 채널에서도 데이터를 추출할 수 있다는 것을 알 수 있습니다.