채널에서 값을 읽는 다양한 방법으로 인해 다른 행동이 나타나는 이유가 궁금합니다. 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, ... select
는 mychan
과 다른 투명 채널을 전환 된 것처럼 모든 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
사소한 문제는 당신의 일부에 보인다, 난 감사하겠습니다.
참고로이 문제를 해결할 수있는 두 번째 코드 '의 경우 <-mychan : fmt.Println (<- mychan가)'** 번 ** mychan에서 읽고 첫 번째 결과를 삭제합니다. 그건 당신이 1, 3, 5, ...을 볼 수 있습니다. 당신은 'case i
Volker
을 원할 것입니다. 모든 채널 수신 작업은 동일합니다 (당연히 2 값 할당이 가능합니다. 닫힌 채널의 상태 표시). 유일한 차이점은 select 문에서받은 값을 모두 버리는 것입니다. – JimB
https://play.golang.org/p/CEMKqJF3ya <-이 코드 스 니펫은 범위 키워드가 열린 채널에서 작동 함을 "증명"합니다. 나는 왜 프로그램이 멈추는 지 궁금하다. 그것은 어떻게 든 폐쇄되지 않을 것이라는 것을 알고 있습니까? –