code: func (s *Semaphore) Acquire() {
  	s.aMutex.Lock()
  	defer s.aMutex.Unlock()
  
  	s.pMutex.Lock()
  	s.avail--
  	s.pMutex.Unlock()
  
  	<-s.channel
  }
docs: // Acquire acquires one permit. If it is not available, the goroutine will block until it is available.