Я на примере параллелизм здесь: https://tour.golang.org/concurrency/5Что происходит в этом примере параллелизма?
Это код:
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x + y
case <- quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<- c)
}
quit <- 0
}()
fibonacci(c, quit)
}
Там довольно немного об этом, что сбивает с толку меня и тур сам по себе ничего не говорит об этом , В нем говорится, что select будет ждать операций связи, но я действительно не понимаю, как это относится к функции, которую он отправляет в goroutine перед вызовом fibonacci
. fmt.Println
отправляется на канал c
, но я просто не понимаю, почему и как это имеет смысл ...
У меня так много вопросов об этом, я надеюсь, ...
Спасибо за ответ, который помогает с первой частью, но теперь я запутался в инструкции select, выбирает ли она 'c <- x' часть, потому что goroutine« открывает »канал, а затем оператор switch читает что-то вроде 'if x можно отправить в c; делать ... '? Если я прав, то как я могу интерпретировать второй случай ...? – deltaskelta
@ deltaskelta yep, вот основная идея. Подумайте об этом как о коммутаторе, где выполняется первое условие, которое выполняется. Вы получаете от канала 'quit', поэтому что-то, отправляющее на' quit', поместит вас в этом случае, вы отправляете 'c', поэтому что-то, прочитав' c', откроет его для другой записи, в этом случае. – evanmcdonnal