2016-07-12 3 views
2

문서 또는 Google에서 완전히 이해할 수 없음 :for 루프와 select 루프의 차이점은 무엇입니까?

둘 사이의 차이점 두 경우의 차이점은 무엇입니까?

for{ 
     select{ 
     case s := <-something: 
      fmt.Println(s) 
     case done := <-true: 
      return 
     } 
    } 

 select{ 
     case s := <-something: 
      fmt.Println(s) 
     case done := <-true: 
      return 
     } 

감사

프로그램은 '뭔가'채널에 당신이 완료를받을 때까지 SELECT 절을 반복 할 예정 시간의 무리를 데이터를 전송하는 경우

답변

7

코드 는 채널 done에 아무것도를받을 때까지 채널 something에서 데이터를 인쇄 유지합니다. 이 채널 done에 아무것도받을 때

선택 전용 코드는 채널 중 하나 인쇄 데이터 something또는 종료 할 것입니다. 이 하나만 실행됩니다. 기본적으로 Go selectswitch 문에는 오류가 없음을 유의하십시오.

1

신호. 당신의 루틴이 루프에만 값을 'x'를 받게됩니다 없습니다와 y 또는 z를 수신하지 않을 경우

예를 들어 상상 다음과 같은 루틴

.... (some calculations) 
something <- x 
.... (some calculations) 
something <- y 
true <- z 

를 실행하고 있습니다. 루프

1

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을 반환 할 수 있습니다.

관련 문제