code: func (rcv *UDP) Listen(addr *net.UDPAddr) error {
  	return rcv.StartFunc(func() error {
  		var err error
  		rcv.conn, err = net.ListenUDP("udp", addr)
  		if err != nil {
  			return err
  		}
  
  		rcv.Go(func(exit chan bool) {
  			<-exit
  			rcv.conn.Close()
  		})
  
  		if rcv.buffer != nil {
  			originalOut := rcv.out
  
  			rcv.Go(func(exit chan bool) {
  				for {
  					select {
  					case <-exit:
  						return
  					case p := <-rcv.buffer:
  						originalOut(p)
  					}
  				}
  			})
  
  			rcv.out = func(p *points.Points) {
  				rcv.buffer <- p
  			}
  		}
  
  		rcv.Go(rcv.receiveWorker)
  
  		return nil
  	})
  }
docs: // Listen bind port. Receive messages and send to out channel