私はここに同時実行の例で午前: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)
}
あり、私に混乱している。この程度はかなりビットがあり、ツアー自体はそれについて多くを言っていません。 。それは選択が通信操作を待つと言いますが、fibonacci
を呼び出す前に、それがゴルーチンに送信する関数にどのように適用されるのか実際にはわかりません。 fmt.Println
がチャネルc
に送信されていますが、理由や理由がわかりません。
私はこれについて多くの質問をしていますが、最初の部分...
最初の部分を助けてくれてありがとうございましたが、select文については混乱しています.Goroutineがチャンネルを「開く」ためにswitch文が読み込まれるため、 'c < - x ' 'xがcに送ることができるかのようなもの;どうすればいい?私が正しいとすれば、どうすれば2番目のケースを解釈できますか? – deltaskelta
@deltaskeltaうん、それは基本的な考えです。それは、それが満たされる最初の条件を実行するスイッチのように考える。あなたは 'quit'チャンネルから受信していますので、' quit'で送信すると 'c'で送信しますので、' c'で読み込んだものが別の書き込みで開かれますその場合に入る。 – evanmcdonnal