Ваше решение приведет к тому, что порожденная программа будет вращаться по каналу, пока не будет отправлено хотя бы одно сообщение.Другими словами, рутина никогда не блокируется вообще.
Здесь вы пытаетесь обработать несколько сообщений в одном пакете.Есть разные способы реализовать это.Но основной вопрос, на который нужно ответить: откуда вы знаете, что пакет сообщений завершен? Программа-отправитель может обладать этими знаниями и может упаковывать все сообщения в один фрагмент.С другой стороны, вы можете не знать, когда партия будет готова.В этих случаях вам нужно использовать тайм-аут, как в следующем примере.
func (c *consumer) handleUser(userID string, ch chan Message) {
user := c.db.LoadUser(userID)
for {
var msgs []Message
select {
case msg := <-ch:
//Append the message in the current batch slice
msgs = append(msgs, msg)
//Wait up to 5 seconds and then process the batch
case <-time.After(time.Second * 5):
//Timeout: process the batch of messages
if len(msgs) > 0 {
apply.Messages(user, msgs)
c.db.SaveUser(user)
}
}
}
}
Обратите внимание, что возможная процедура, выполняющая эту функцию, запускается только тогда, когда на самом деле есть чем заняться.