code: func (s *Service) Start() error {
  	err := s.startChannel()
  	if err != nil {
  		return err
  	}
  
  	s.wg.Add(1)
  	go func() {
  		defer s.wg.Done()
  
  		// Same polling interval and backoff logic as vmtoolsd.
  		// Required in our case at startup at least, otherwise it is possible
  		// we miss the 1 Capabilities_Register call for example.
  
  		// Note we Send(response) even when nil, to let the VMX know we are here
  		var response []byte
  
  		for {
  			select {
  			case <-s.stop:
  				s.stopChannel()
  				return
  			case <-time.After(time.Millisecond * 10 * s.delay):
  				if err = s.checkReset(); err != nil {
  					continue
  				}
  
  				err = s.in.Send(response)
  				response = nil
  				if err != nil {
  					s.delay = resetDelay
  					s.rpcError = true
  					continue
  				}
  
  				request, _ := s.in.Receive()
  
  				if len(request) > 0 {
  					response = s.Dispatch(request)
  
  					s.delay = 0
  				} else {
  					s.backoff()
  				}
  			}
  		}
  	}()
  
  	return nil
  }
docs: // Start initializes the RPC channels and starts a goroutine to listen for incoming RPC requests