0Pricing
Go Academy · 강의

select 문

select를 사용한 채널 다중화

select 문은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

셀렉트란 무엇입니까

select 문을 사용하면 고루틴이 여러 채널 작업을 동시에 기다릴 수 있습니다. 채널을 위한 switch와 비슷하게, 실행할 준비가 된 첫 번째 케이스를 선택합니다.

기본 문법

select의 각 case는 채널로 보내거나 채널에서 받는 작업입니다:

select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}

default를 사용한 비차단 동작

default 케이스를 추가하면 셀렉트가 비차단 방식으로 동작합니다. 준비된 채널이 없으면 즉시 default로 넘어갑니다.

select {
case v := <-ch:
    fmt.Println(v)
default:
    fmt.Println("no value ready")
}

무작위 선택

여러 케이스가 동시에 준비되면 Go는 그중 하나를 무작위로 선택합니다. 준비된 모든 케이스의 선택 확률은 동일합니다. 이를 통해 특정 케이스가 계속 처리되지 못하는 현상을 방지합니다.

셀렉트에서 보내기

케이스에서 채널로 보낼 수도 있습니다. 채널에 버퍼 공간이 있거나 대기 중인 수신자가 있으면 보내기 케이스가 준비됩니다.

select {
case ch1 <- val1:
    fmt.Println("sent to ch1")
case ch2 <- val2:
    fmt.Println("sent to ch2")
}

빈 셀렉트는 영원히 차단됩니다

케이스가 없는 단독 select{}는 현재 고루틴을 영원히 차단합니다. 다른 고루틴이 실행되는 동안 메인 고루틴을 계속 살아 있게 하는 일반적인 관용구입니다.

func main() {
    go serve()
    select {} // block forever
}

셀렉트 반복하기

select를 for 반복문 안에 넣으면 채널을 계속 다중화할 수 있습니다. 완료 채널을 추가하면 깔끔하게 반복문을 빠져나올 수 있습니다.

for {
    select {
    case v := <-data:
        process(v)
    case <-done:
        return
    }
}

널 채널

널 채널은 셀렉트의 해당 케이스를 영원히 차단하므로 사실상 그 케이스를 비활성화합니다. 이를 사용하면 실행 중에 케이스를 동적으로 활성화하거나 비활성화할 수 있습니다.

var ch chan int // nil
select {
case v := <-ch: // never selected
    _ = v
case v := <-other:
    fmt.Println(v)
}

닫힌 채널과 셀렉트

닫힌 채널에서 받기 작업은 항상 즉시 성공하며 0 값을 반환합니다. 채널이 닫혔는지 확인하려면 두 값 형식을 사용해야 합니다.

select {
case v, ok := <-ch:
    if !ok { return } // channel closed
    use(v)
}

우선순위 패턴

Go의 셀렉트는 기본적으로 우선순위를 지원하지 않습니다. 특정 채널의 우선순위를 높이려면 셀렉트를 중첩하거나, default와 함께 우선순위가 높은 채널을 먼저 확인하는 반복문을 사용합니다.

for {
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-lowPriority:
            handle(v)
        }
    }
}

지금까지의 복습

select는 여러 채널을 기다리고, 준비된 케이스를 무작위로 선택하며, 비차단 동작을 위해 default를 지원합니다. 널 채널은 케이스를 비활성화합니다. 일반적인 패턴은 for+select+완료 채널입니다.

빠른 확인

셀렉트의 여러 케이스가 동시에 준비되면 어떻게 됩니까?

복습: select 문

핵심 내용:

  • select는 하나의 채널 케이스가 준비될 때까지 차단합니다
  • 준비된 케이스가 여러 개이면 무작위로 선택합니다
  • default를 사용하면 비차단 방식으로 동작합니다
  • 널 채널은 해당 케이스를 비활성화합니다
  • for+select+완료 채널은 표준 다중화 반복문입니다

자주 묻는 질문

“select 문” 강의는 무료인가요?

네 — “select 문” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“select 문”에서 뭘 배우나요?

select를 사용한 채널 다중화 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“select 문” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. select 문
  2. 타임아웃과 틱커
  3. 팬인과 팬아웃 패턴
  4. 워커 풀 패턴
← Go Academy(으)로 돌아가기