code: func (s *Server) Start() error {
  	if s.LogError == nil {
  		s.LogError = errorLogger
  	}
  	if s.Handler == nil {
  		panic("gorpc.Server: Server.Handler cannot be nil")
  	}
  
  	if s.serverStopChan != nil {
  		panic("gorpc.Server: server is already running. Stop it before starting it again")
  	}
  	s.serverStopChan = make(chan struct{})
  
  	if s.Concurrency <= 0 {
  		s.Concurrency = DefaultConcurrency
  	}
  	if s.FlushDelay == 0 {
  		s.FlushDelay = DefaultFlushDelay
  	}
  	if s.PendingResponses <= 0 {
  		s.PendingResponses = DefaultPendingMessages
  	}
  	if s.SendBufferSize <= 0 {
  		s.SendBufferSize = DefaultBufferSize
  	}
  	if s.RecvBufferSize <= 0 {
  		s.RecvBufferSize = DefaultBufferSize
  	}
  
  	if s.Listener == nil {
  		s.Listener = &defaultListener{}
  	}
  	if err := s.Listener.Init(s.Addr); err != nil {
  		err = fmt.Errorf("gorpc.Server: [%s]. Cannot listen to: [%s]", s.Addr, err)
  		s.LogError("%s", err)
  		return err
  	}
  
  	workersCh := make(chan struct{}, s.Concurrency)
  	s.stopWg.Add(1)
  	go serverHandler(s, workersCh)
  	return nil
  }
docs: // Start starts rpc server.
  //
  // All the request and response types the Handler may use must be registered
  // with RegisterType() before starting the server.
  // There is no need in registering base Go types such as int, string, bool,
  // float64, etc. or arrays, slices and maps containing base Go types.