Исходный код от gobyexample
Я изменил задания буферизованного канала на 2 и сделал j в for для l oop 6, так как я хочу увидеть, как программа вести себя, если данные в очереди длиннее буферизованного канала.
После запуска программы результат меня полностью смутил. Во-первых, в стеках есть три отправленных задания, которые, как я догадался, должны составлять две в стеках, того же размера, что и канал. Во-вторых, задание 4 получено раньше, чем было отправлено, как могло бы, чем вообще возможно.
Пожалуйста, смотрите код и результат ниже. У кого-нибудь есть подсказка, пожалуйста, помогите. Заранее спасибо.
package main
import "fmt"
func main() {
jobs := make(chan int, 2)
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 <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
<-done
}
$ go run main.go
sent job 1
sent job 2
sent job 3
received job 1
received job 2
received job 3
received job 4
sent job 4
sent job 5
sent job 6
sent all jobs
received job 5
received job 6
received all jobs