Завершение работы «рабочего» происходит после того, как буфер опустеет

Я хочу, чтобы мой рабочий рутина (ProcessToDo() в приведенном ниже коде), чтобы дождаться обработки всей «поставленной в очередь» работы перед завершением работы.

Рабочая подпрограмма имеет канал «делать» (буферизованный), по которому на нее отправляется работа. И у него есть «готовый» канал, чтобы сказать ему начать выключение. В документации говорится, что выборка на каналах выберет «псевдослучайное значение», если выполнено более одного выбора ... это означает, что отключение (возврат) запускается до завершения всей буферизованной работы.

В приведенном ниже примере кода я хочу напечатать все 20 сообщений ...

package main

import (
    "time"
    "fmt"
)


func ProcessToDo(done chan struct{}, todo chan string) {
    for {
        select {
        case work, ok := <-todo:
            if !ok {
                fmt.Printf("Shutting down ProcessToDo - todo channel closed!\n")
                return
            }
            fmt.Printf("todo: %q\n", work)
            time.Sleep(100 * time.Millisecond)
        case _, ok := <-done:
            if ok {
                fmt.Printf("Shutting down ProcessToDo - done message received!\n")
            } else {
                fmt.Printf("Shutting down ProcessToDo - done channel closed!\n")
            }
            close(todo)
            return
        }
    }
}

func main() {

    done := make(chan struct{})
    todo := make(chan string, 100)

    go ProcessToDo(done, todo)

    for i := 0; i < 20; i++ {
        todo <- fmt.Sprintf("Message %02d", i)
    }

    fmt.Println("*** all messages queued ***")
    time.Sleep(1 * time.Second)
    close(done)
    time.Sleep(4 * time.Second)
}

Ответы на вопрос(2)

Ваш ответ на вопрос