2014-10-10 1 views
-1

1 - 무슨 일 이죠?채널에 대한 질문이 있으시면

몇 분 정도 더 이상 데이터가 없으면 중단됩니다. 코드가 아래와 동일합니까?

deliveries <- chan amqp.Delivery 
for{ 
    d,ok:=<-deliveries 
    if !ok{ 
     break 
    } 
    //code 
} 

2 - 왜 짱 반환 데이터뿐만 아니라 상태뿐만 아니라합니까? 그리고 "OK"가 무엇을 의미합니까?

3-chan은 어떻게 알 수 있습니까? "ok"는 클라이언트의 상태입니다. 왜 "ok"를 반환 할 수 있습니까?

답변

0

나는 첫 번째 질문 2와 3을 응답 할 것이다.

receive 표현의 두 번째 결과는 조작이 성공적 이었는지를 나타내는 bool입니다. 두 번째 결과는 전송 된 값이 수신되면 true이고, 채널이 닫혀서 0 값이 수신되면 false입니다.

1) 채널의 범위는 채널이 닫힐 때까지 채널에서 전송 된 값을받습니다.

다음 루프는 매우 유사합니다. 둘 다 채널이 닫힐 때까지 값을받습니다.

for v := range c { 
    // code 
} 

for { 
    v, ok := <-c 
    if != ok { 
     break 
    } 
    // code 
} 

이러한 루프 간의 주요 차이점은 변수 v의 범위입니다. v의 범위는 첫 번째 루프 외부와 두 번째 루프 내부입니다. use a closure and goroutine in the loop 인 경우이 구분이 중요합니다.

+0

클로저의 경우조차도 거의 모든 경우 두 번째 코드 (코드 4 줄)보다 첫 번째 코드 (한 줄의 코드)를 권하고 싶습니다. 당신은 언제나 당신의 goroutine에 매개 변수로서'v'를 넘겨 줄 수 있습니다 (또는 필요하다면 다시 선언 할 수 있습니다). 더 많은 행 == 더 많은 버그. 예 : 두 번째 양식의 코드가 컴파일되지 않습니다. – Dustin

0

1) 코드 1과 2가 다릅니다. 두 번째 코드도 ok을 가져 오며, 이는 채널이 보낸 사람에 의해 닫혔는지 여부를 나타냅니다. 이렇게하면 코드가 더욱 강력 해집니다.

2) 채널은 한 가지 유형의 메시지 만 전송할 수 있습니다. 상태 코드가 필요한 경우 메시지 안에 넣으십시오. 대답은 컨텍스트를 제공하기 때문에 내 대답은 더 이상 값이 채널 C로 전송됩니다 1.

2, 3) 내장 함수 close(c) 기록에 의문을 제기하는

+0

강력 함을 제외 할 경우 코드 1과 2는 서로 동일합니까? 코드 1이 죽은 재활용입니까? –

+1

채널의 범위 대신 for/select를 사용하면 절대적으로 코드가 더 강력 해지지 않으므로 수행하지 않아야합니다. 채널이 닫히면 루프가 종료됩니다. 이를 위해 더 많은 코드를 작성하면 더 많은 버그가 발생할 수 있습니다. – Dustin

관련 문제