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를 사용하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.