func (q *QueueInfo) ReceiveMessage(h ReceiveHandle) { var input sqs.ReceiveMessageInput input.QueueUrl = q.Queue input.WaitTimeSeconds = &waitTime input.MessageAttributeNames = []*string{&valueName} input.MaxNumberOfMessages = &maxMsg ro, _ := thisSQS.ReceiveMessage(&input) l := len(ro.Messages) if l > 0 { needDele := set.New() wg := new(sync.WaitGroup) for i := 0; i < l; i++ { msg := ro.Messages[i] atts := msg.MessageAttributes wg.Add(1) go h(wg, atts["value"].BinaryValue, needDele, i) } wg.Wait() indexes := set.IntSlice(needDele) var entries []*sqs.DeleteMessageBatchRequestEntry for _, index := range indexes { msg := ro.Messages[index] var entry sqs.DeleteMessageBatchRequestEntry entry.Id = msg.MessageId entry.ReceiptHandle = msg.ReceiptHandle entries = append(entries, &entry) } q.deleteMessage(&entries) } q.ReceiveMessage(h) }