2016-12-22 3 views
0

채널에서 값을 읽는 다양한 방법으로 인해 다른 행동이 나타나는 이유가 궁금합니다. mychan 채널 무한 정수채널을 읽는 차이점

mychan := make(chan int) 

go func() { 
    i := 0 
    for { 
     mychan <- i 
     <-time.After(time.Second * 1) 
     i++ 
    } 
}() 

goroutine "스트림"는 서열의 코드를 제공한다. 이 코드 후에는 <-mychan과 같이 직접 읽을 경우 :

fmt.Println(<-mychan) 

이 인쇄 "0"예상대로입니다. 반복하면 다음과 같이 계속 읽습니다.

fmt.Println(<-mychan) // 1 
fmt.Println(<-mychan) // 2 
//... 

그러나 루핑 메커니즘을 사용하면 무한정 차단됩니다.

for i := range mychan { 
    fmt.Println(i) 
} 

즉,이 메커니즘은 폐쇄 채널에서만 읽을 수 있습니다. 그러나 select 방법, 물건 wierder 얻는다 :

for i:=0; i<=10;i++ { 
    select { 
    case <-mychan: 
     fmt.Println(<-mychan) 
    } 
} 

지금이 같은 교대 출력 1, 3, 5, 9, ... selectmychan과 다른 투명 채널을 전환 된 것처럼 모든 2S. 경우 (의도 웃기가) 다른 case을하게 추가 : 사람이 설명하고 가르치 려 수 있다면 그것이 수도로

for i:=0; i<=10;i++ { 
    select { 
    case <-time.After(1 * time.Second): 
     fmt.Println("foo") 
    case <-mychan: 
     fmt.Println(<-mychan) 
    } 
} 

// now prints 1, foo, 3, foo, 5, foo, ... every 1s 

사소한 문제는 당신의 일부에 보인다, 난 감사하겠습니다.

+3

참고로이 문제를 해결할 수있는 두 번째 코드 '의 경우 <-mychan : fmt.Println (<- mychan가)'** 번 ** mychan에서 읽고 첫 번째 결과를 삭제합니다. 그건 당신이 1, 3, 5, ...을 볼 수 있습니다. 당신은 'case i Volker

+0

을 원할 것입니다. 모든 채널 수신 작업은 동일합니다 (당연히 2 값 할당이 가능합니다. 닫힌 채널의 상태 표시). 유일한 차이점은 select 문에서받은 값을 모두 버리는 것입니다. – JimB

+0

https://play.golang.org/p/CEMKqJF3ya <-이 코드 스 니펫은 범위 키워드가 열린 채널에서 작동 함을 "증명"합니다. 나는 왜 프로그램이 멈추는 지 궁금하다. 그것은 어떻게 든 폐쇄되지 않을 것이라는 것을 알고 있습니까? –

답변

4

동작

for i := range mychan { 
    fmt.Println(i) 
} 

에서 것은 내가 모든 두 번째 무기한 하나 개의 값에서 로컬 프로그램의 인쇄 코드를 실행하면 go playground에서 예제를 실행 결과에 나타납니다. 코드가 영원히 작동하는지 파악하기 위해 서버에서 사용하는 코드 분석 도구가 있으면 멋질 것입니다.

Volker가 지적한 것처럼 두 번째 예제는 인쇄 문당 채널을 두 번 읽는 것입니다. 당신은

for i:=0; i<=10;i++ { 
    select { 
    case <-time.After(1 * time.Second): 
     fmt.Println("foo") 
    case x, open := <-mychan: 
     if !open { return } 
     fmt.Println(x) 
    } 
} 
+1

좋아요. 그러나 첫 번째 경우를 생략하거나 초기 인쇄 후에 "foo"만 인쇄합니다. 또한, 두 번째 경우''= ' – PieOhPah

+0

이 누락되었습니다. Foo가 나를 대신하여 인쇄 할 것 같습니다. 내가 이해할 수 있는지 모르겠다 (과제 수정에 대한 감사) –