golang буферизованных каналов, получать данные перед отправкой - PullRequest
0 голосов
/ 19 апреля 2020

Исходный код от 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...