code: func (a *AddrBook) GetSelection() []*NetAddress {
  	a.mtx.Lock()
  	defer a.mtx.Unlock()
  
  	if a.size() == 0 {
  		return nil
  	}
  
  	allAddr := make([]*NetAddress, a.size())
  	i := 0
  	for _, v := range a.addrLookup {
  		allAddr[i] = v.Addr
  		i++
  	}
  
  	numAddresses := MaxInt(
  		MinInt(minGetSelection, len(allAddr)),
  		len(allAddr)*getSelectionPercent/100)
  	numAddresses = MinInt(maxGetSelection, numAddresses)
  
  	// Fisher-Yates shuffle the array. We only need to do the first
  	// `numAddresses' since we are throwing the rest.
  	for i := 0; i < numAddresses; i++ {
  		// pick a number between current index and the end
  		j := rand.Intn(len(allAddr)-i) + i
  		allAddr[i], allAddr[j] = allAddr[j], allAddr[i]
  	}
  
  	// slice off the limit we are willing to share.
  	return allAddr[:numAddresses]
  }
docs: /* Peer exchange */
  // GetSelection randomly selects some addresses (old & new). Suitable for peer-exchange protocols.