는 소수의 예 내가 이해하는 코드이 예에서 채널은 어떻게 작동합니까? 이것은
prime := <-ch
채널 입력을 기다리고의 라인과 프라임에 할당
package main
func Generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i
}
}
func Filter(in <-chan int, out chan<- int, prime int) {
for {
i := <-in
if i%prime != 0 {
out <- i
}
}
}
func main() {
ch := make(chan int)
go Generate(ch)
for i := 0; i < 10; i++ {
prime := <-ch
print(prime, "\n")
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
}
체입니다. 모든 숫자가 인쇄되지 않는 이유는 11
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
이 모든 숫자가 2에서 인쇄이 마지막 3 줄을 제거하면 그래서, 다음 문이 줄을 무엇
print(prime, "\n")
를 호출 할 때 do ch = ch1? 이 루프의 각 반복에서 동일한 채널 아니기 때문에
감사
컨텍스트 : http://golang.org/doc/play/sieve.go. 또한 http://blog.onideas.ws/eratosthenes.go에서 최적화되었습니다. – VonC
@VonC 링크에 감사드립니다.인용 된 기사에는 중급이지만 중요한 개선 단계 인 [연기] (http://stackoverflow.com/a/8871918/849891)에 대한 아이디어가 없습니다. 또 다른 중요한 최적화 (연기와 관련이있다.)는 피드백 루프를 깨뜨림으로써 (블로그가 언급 한) [기억력 감소] (http://stackoverflow.com/a/13895347/849891)이다. 이렇게하면 작은 버퍼 (파이썬 버전 [여기] (http://stackoverflow.com/a/10733621/849891) - 코드의 4 번째 줄 참조)를 가진 소수 생성 채널의 타워를 가질 수 있습니다. –
@WillNess는 언뜻 보면 잘 보입니다. – VonC