В sync семафора нет. Реализуют через буферизованный канал (отправка - захват, приём - освобождение) или через golang.org/x/sync/semaphore. В Go 1.21+ есть runtime/sem для внутреннего использования, но для пользовательского кода обычно канал или semaphore.Weighted.