Как ограничить количество использований ручки дефолтными инструментами Go

«Как ограничить количество использований ручки дефолтными инструментами Go» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для ограничения количества одновременных вызовов обработчика в Go можно использовать semaphore или buffered channel.

Пример с буферизированным каналом:

var sem = make(chan struct{}, 10) // Макс 10 одновременных запросов

func handler(w http.ResponseWriter, r *http.Request) {
    sem <- struct{}{}        // Занять слот
    defer func() { <-sem }() // Освободить слот

    // Логика обработки
    time.Sleep(1 * time.Second)
    w.Write([]byte("OK"))
}

Или с sync.Semaphore (Go 1.21+):

var sem = semaphore.NewWeighted(10)

func handler(w http.ResponseWriter, r *http.Request) {
    if err := sem.Acquire(r.Context(), 1); err != nil {
        return
    }
    defer sem.Release(1)

    // Логика обработки
}

Оба варианта ограничивают конкурентные вызовы без сторонних библиотек.