我是一名新的 Go 學習者,當我到達“關(guān)閉頻道”部分時,教程會插入此代碼片段(我將刪除原始評論):? ? package main? ? import "fmt"? ? func main() {? ? ? ? jobs := make(chan int, 5)? ? ? ? done := make(chan bool)? ? ? ?go func() {? ? ? ? ? ?for {? ? ? ? ? ? ? ?j, more := <-jobs? ? ? ? ? ? ? ?if more {? ? ? ? ? ? ? ? ? ?fmt.Println("received job", j)? ? ? ? ? ? ? ?} else {? ? ? ? ? ? ? ? ? ?fmt.Println("received all jobs")? ? ? ? ? ? ? ? ? ?done <- true? ? ? ? ? ? ? ? ? ?return? ? ? ? ? ? ? ?}? ? ? ? ? ?}? ? ? ?}()? ? ? ?for j := 1; j <= 18; j++ {? ? ? ? ? ?jobs <- j? ? ? ? ? ?fmt.Println("sent job", j)? ? ? ?}? ? ? ?close(jobs)? ? ? ?fmt.Println("sent all jobs")? ? ? ?<-done? ? }原始代碼在作業(yè)發(fā)送者循環(huán)中設(shè)置 3 而不是 18。在play.golang.org中執(zhí)行這段代碼是我不完全理解的。它總是輸出以下內(nèi)容:sent job 1sent job 2sent job 3sent job 4sent job 5received job 1received job 2received job 3received job 4received job 5received job 6sent job 6sent job 7sent job 8sent job 9sent job 10sent job 11sent job 12received job 7received job 8received job 9received job 10received job 11received job 12received job 13sent job 13sent job 14sent job 15sent job 16sent job 17sent job 18sent all jobsreceived job 14received job 15received job 16received job 17received job 18received all jobs所以我知道一個頻道的“隊列”(我知道這個術(shù)語不是最準確的,但為了自己學習,這是我對頻道的理解)的大小為 5,所以前 10日志消息對我來說很好。但是消息 6 和 13 如何在實際發(fā)送之前輸出它們的接收信息呢?如果通道大小為 5,如何連續(xù)發(fā)送 7 條消息?我錯過了什么?
2 回答

炎炎設(shè)計
TA貢獻1808條經(jīng)驗 獲得超4個贊
Goroutines 同時運行,因此它們也同時打印到標準輸出(即無序)。此外,fmt.Print API 是緩沖的,因此您的打印實際上不會在調(diào)用時立即打印。這也發(fā)生在其他語言中。
這就是為什么您無法從 stdout 中的消息中導出 goroutine 的真正并發(fā)執(zhí)行。

牧羊人nacy
TA貢獻1862條經(jīng)驗 獲得超7個贊
但是消息 6 和 13 如何在實際發(fā)送之前輸出它們的接收信息呢?
我們只知道fmt.Println("received job", j)
was printed before fmt.Println("sent job", j)
was printed,這在并發(fā)工作代碼中是合理的。
如果通道大小為 5,如何連續(xù)發(fā)送 7 條消息?
同樣,因為我們不確切知道哪個語句首先打印出來,所以這是可以預料的。隊列已經(jīng)可以減少,我們?nèi)栽诖蛴 ?/p>
- 2 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報
0/150
提交
取消