code: func (g *gossipServiceImpl) Accept(acceptor common.MessageAcceptor, passThrough bool) (<-chan *proto.GossipMessage, <-chan proto.ReceivedMessage) {
  	if passThrough {
  		return nil, g.comm.Accept(acceptor)
  	}
  	acceptByType := func(o interface{}) bool {
  		if o, isGossipMsg := o.(*proto.GossipMessage); isGossipMsg {
  			return acceptor(o)
  		}
  		if o, isSignedMsg := o.(*proto.SignedGossipMessage); isSignedMsg {
  			sMsg := o
  			return acceptor(sMsg.GossipMessage)
  		}
  		g.logger.Warning("Message type:", reflect.TypeOf(o), "cannot be evaluated")
  		return false
  	}
  	inCh := g.AddChannel(acceptByType)
  	outCh := make(chan *proto.GossipMessage, acceptChanSize)
  	go func() {
  		for {
  			select {
  			case s := <-g.toDieChan:
  				g.toDieChan <- s
  				return
  			case m := <-inCh:
  				if m == nil {
  					return
  				}
  				outCh <- m.(*proto.SignedGossipMessage).GossipMessage
  			}
  		}
  	}()
  	return outCh, nil
  }
docs: // Accept returns a dedicated read-only channel for messages sent by other nodes that match a certain predicate.
  // If passThrough is false, the messages are processed by the gossip layer beforehand.
  // If passThrough is true, the gossip layer doesn't intervene and the messages
  // can be used to send a reply back to the sender