>  기사  >  백엔드 개발  >  Go에서 모든 채널이 닫힐 때 Select 문을 어떻게 깨뜨릴 수 있나요?

Go에서 모든 채널이 닫힐 때 Select 문을 어떻게 깨뜨릴 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-13 16:47:02189검색

How to Break Out of a Select Statement When All Channels Are Closed in Go?

모든 채널이 닫힐 때 Select 문에서 벗어나기

여러 고루틴이 개별 채널에 데이터를 보내는 시나리오를 생각해 보세요. 이 데이터를 임의의 순서로 소비합니다. select 문을 사용하면 여러 소스의 동시 입력을 처리하는 편리한 방법이 제공됩니다. 그러나 모든 채널이 닫힌 경우에만 루프를 종료해야 하는 경우 문제가 발생합니다.

순진한 솔루션

직관적인 접근 방식에는 각 채널의 가용성을 확인하는 것이 포함될 수 있습니다. ok 플래그를 사용하여. 그러나 이 솔루션은 닫힌 채널을 선택하면 다시 사용할 수 있게 되므로 오류가 발생하기 쉽습니다. 이는 다음 놀이터 예시에서 볼 수 있듯이 무한 루프로 이어집니다: http://play.golang.org/p/rOjdvnji49.

개선된 솔루션

더 보기 효과적인 접근 방식은 채널이 전혀 통신할 준비가 되어 있지 않다는 사실을 활용하는 것입니다. 채널이 닫힐 때마다 nil로 설정하여 향후 select 문에서 제외되도록 할 수 있습니다. 이렇게 하면 모든 채널이 닫힐 때만 루프가 종료됩니다.

for {
    select {
    case x, ok := <-ch:
        fmt.Println("ch1", x, ok)
        if !ok {
            ch = nil
        }
    case x, ok := <-ch2:
        fmt.Println("ch2", x, ok)
        if !ok {
            ch2 = nil
        }
    }

    if ch == nil &amp;&amp; ch2 == nil {
        break
    }
}

플레이그라운드 예시: http://play.golang.org/p/8lkV_Hffyj

실용적 고려 사항

실제로 많은 수의 채널을 처리해야 하는 경우는 거의 없습니다. 단일 선택 문. 그러한 시나리오가 발생하는 경우 채널 멀티플렉서와 ​​같은 보다 전문적인 솔루션을 사용하여 과도한 nil 검사로 인해 코드가 복잡해지는 것을 방지하는 것이 좋습니다.

위 내용은 Go에서 모든 채널이 닫힐 때 Select 문을 어떻게 깨뜨릴 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.