메뉴

문서정보

에제로 살펴보는 Go : Select

Go의 select를 이용하면 여러 개의 채널로 부터 메시지를 기다릴 수 있다.

package main

import (
    "fmt"
    "time"
)

func main() {
    c1 := make(chan string)
    c2 := make(chan string)
    
    go func() {
        time.Sleep(time.Second * 1)
        c1 <- "첫번째 고루틴"
    }()
    go func() {
        time.Sleep(time.Second * 2)
        c1 <- "두번째 고루틴"
    }()
    
    for i:=0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("Received: ", msg1)
        case msg2 := <-c2:
            fmt.Println("Received: ", msg2)
        }
    }
}
		
예제 코드는 두 개의 고루틴을 가지고 있다. main 함수는 이들 고루틴으로 부터 메시지를 기다리는데, 고루틴에 따라서 서로 다른 처리를 해야 한다. 22 번째 줄에서 select를 이용해서 복수의 채널로 부터의 메시지를 기다리며 블럭된다. 어떤 채널로 부터 메시지가 발생하면, 블럭이 풀리고 case 문을 이용해서 메시지가 발생한 채널로 부터 메시지를 읽을 수 있다. 채널 다중화(multiplexing)를 위한 툴로 볼 수 있겠다.

연습 문제

메시지에 고루틴 정보를 넣는 방식으로 하나의 채널을 사용하는 방법도 있다. 아래의 코드를 완성해보자.
package main

import "fmt"

type info struct {
    name string
}
	
func main() {
    channel := make(chan info,1)
    go func() {
    }()
    go func() {
    }()
    
    for i := 0; i < 2; i++ {
    }
}
		

다음 예제 : Timeout