PHpullh

GO · 고루틴/채널

select 심화

select로 여러 채널 연산을 동시에 대기합니다. default로 논블로킹 동작도 가능합니다.

고루틴/채널중급selectchannelnon-blockingnil-channel

핵심 설명

select로 여러 채널 연산을 동시에 대기합니다. default로 논블로킹 동작도 가능합니다.

Go code

package main

import (
	"fmt"
	"time"
)

func main() {
	ch1 := make(chan string)
	ch2 := make(chan string)

	go func() { time.Sleep(100 * time.Millisecond); ch1 <- "one" }()
	go func() { time.Sleep(200 * time.Millisecond); ch2 <- "two" }()

	// 먼저 도착하는 것 처리
	for i := 0; i < 2; i++ {
		select {
		case msg := <-ch1:
			fmt.Println("ch1:", msg)
		case msg := <-ch2:
			fmt.Println("ch2:", msg)
		}
	}

	// 논블로킹 수신
	ch := make(chan int, 1)
	select {
	case v := <-ch:
		fmt.Println("수신:", v)
	default:
		fmt.Println("데이터 없음 (논블로킹)")
	}

	// nil 채널로 case 비활성화
	var active chan int = nil
	select {
	case <-active: // nil 채널은 영원히 블로킹 → 이 case 무시됨
	case <-time.After(100 * time.Millisecond):
		fmt.Println("nil 채널은 무시됨")
	}
}

학습 팁

nil 채널에 대한 select case는 영원히 블로킹되므로, 특정 case를 동적으로 비활성화하는 데 활용할 수 있습니다.

주의할 점

select에서 여러 case가 동시에 준비되면 Go 런타임이 무작위로 하나를 선택합니다. 특정 우선순위가 필요하면 중첩 select를 사용하세요.

자주 묻는 질문

select 심화란 무엇인가요?

select 로 여러 채널 연산을 동시에 대기합니다. default 로 논블로킹 동작도 가능합니다.

select 심화 학습 시 주의할 점은 무엇인가요?

select 에서 여러 case가 동시에 준비되면 Go 런타임이 무작위로 하나를 선택합니다. 특정 우선순위가 필요하면 중첩 select를 사용하세요.