Это идиоматический пул рабочих потоков в Go?

Я пытаюсь написать простой рабочий пул с программами.

Является ли код, который я написал, идиоматическим? Если нет, то что должно измениться?Я хочу иметь возможность установить максимальное количество рабочих потоков равным 5 и блокировать, пока рабочий не станет доступным, если все 5 заняты. Как бы я расширил это, чтобы иметь только пул максимум 5 рабочих? Я порождаю статические 5 горутин и даю каждомуwork_channel?

код:

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

func worker(id string, work string, o chan string, wg *sync.WaitGroup) {
    defer wg.Done()
    sleepMs := rand.Intn(1000)
    fmt.Printf("worker '%s' received: '%s', sleep %dms\n", id, work, sleepMs)
    time.Sleep(time.Duration(sleepMs) * time.Millisecond)
    o <- work + fmt.Sprintf("-%dms", sleepMs)
}

func main() {
    var work_channel = make(chan string)
    var results_channel = make(chan string)

    // create goroutine per item in work_channel
    go func() {
        var c = 0
        var wg sync.WaitGroup
        for work := range work_channel {
            wg.Add(1)
            go worker(fmt.Sprintf("%d", c), work, results_channel, &wg)
            c++
        }
        wg.Wait()
        fmt.Println("closing results channel")
        close(results_channel)
    }()

    // add work to the work_channel
    go func() {
        for c := 'a'; c < 'z'; c++ {
            work_channel <- fmt.Sprintf("%c", c)
        }
        close(work_channel)
        fmt.Println("sent work to work_channel")
    }()

    for x := range results_channel {
        fmt.Printf("result: %s\n", x)
    }
}

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

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