我是一名新的 Go 学习者,当我到达“关闭频道”部分时,教程会插入此代码片段(我将删除原始评论):
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
}
原始代码在作业发送者循环中设置 3 而不是 18。
在play.golang.org中执行这段代码是我不完全理解的。它总是输出以下内容:
sent job 1
sent job 2
sent job 3
sent job 4
sent job 5
received job 1
received job 2
received job 3
received job 4
received job 5
received job 6
sent job 6
sent job 7
sent job 8
sent job 9
sent job 10
sent job 11
sent job 12
received job 7
received job 8
received job 9
received job 10
received job 11
received job 12
received job 13
sent job 13
sent job 14
sent job 15
sent job 16
sent job 17
sent job 18
sent all jobs
received job 14
received job 15
received job 16
received job 17
received job 18
received all jobs
所以我知道一个频道的“队列”(我知道这个术语不是最准确的,但为了自己学习,这是我对频道的理解)的大小为 5,所以前 10日志消息对我来说很好。
但是消息 6 和 13 如何在实际发送之前输出它们的接收信息呢?如果通道大小为 5,如何连续发送 7 条消息?我错过了什么?
炎炎设计
牧羊人nacy
相关分类