모든 채널이 닫힐 때 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 && ch2 == nil { break } }
플레이그라운드 예시: http://play.golang.org/p/8lkV_Hffyj
실용적 고려 사항
실제로 많은 수의 채널을 처리해야 하는 경우는 거의 없습니다. 단일 선택 문. 그러한 시나리오가 발생하는 경우 채널 멀티플렉서와 같은 보다 전문적인 솔루션을 사용하여 과도한 nil 검사로 인해 코드가 복잡해지는 것을 방지하는 것이 좋습니다.
위 내용은 Go에서 모든 채널이 닫힐 때 Select 문을 어떻게 깨뜨릴 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!