select
문은 cases
(채널 송수신)을 통해 한 번 실행됩니다. 해당 사례가 실행 준비가되어 있지 않으면 case
중 하나 이상을 실행할 준비가 완료 될 때까지 차단됩니다. 하나 이상의 사례가 동시에 준비되면 준비된 사례 중 하나가 무작위로 실행되도록 선택됩니다.
따라서 두 번째 경우 something
채널에 일부 데이터가있는 경우이를 읽고 s
에 넣습니다. 그러나 에 true
이 전송되고 case s := <-something:
이 실행되지 않을 가능성이 있습니다.
for{
select{
case s := <-something:
fmt.Println(s)
case <-done: // note the difference
return
}
}
이것이 지금하는 일은이 something
에 데이터를 기다리는이며, 또한 done
에 눈을 유지 : 첫 번째 경우
, 당신은 아마 (또한 두 번째 경우에) 이런 일을 할 수 있습니다.
something
채널에 데이터가 있고 (
done
에 데이터 없음) 읽으면
s
에 넣습니다 (이 경우
case s := <-something:
은
something
에서 값을 읽은
s
으로 실행됩니다). 이것은
select
명령문을 한 번만 실행하면 제어가
for
루프로 돌아가고 다시 시작됩니다.
가 something
채널 select
블록에 데이터가없고 something
또는 done
하나에 데이터를 기다린다.데이터가 something
에 도착하면 위와 비슷한 결과가 발생하고, 그렇지 않으면 done
에 도달하면 함수가 반환됩니다 (루프가 끊어짐). 이 방법은 다른 프로세스가 done
에 쓰고 for
루프를 포함하는 함수에 신호 처리를 중단하고 something
을 반환 할 수 있습니다.