Буферизованный канал с ёмкостью n: отправка - захват, приём - освобождение. Ограничивает число одновременных операций.
sem := make(chan struct{}, 10) sem <- struct{}{} // acquire defer func() { <-sem }() // release doWork()