我相信我对正常用例中的 defer 理解得很好。比如这个问题中列出的Golang defer 行为。但是,我对在不返回的 goroutine 中调用 defer 时发生的事情感到有些困惑。这是有问题的代码。
func start_consumer() {
conn, _ := amqp.Dial("amqp://username:password@server.com")
//defer conn.Close()
ch, _ := conn.Channel()
//defer ch.Close()
q, _ := ch.QueueDeclare(
"test", // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
_ = ch.Qos(
3, // prefetch count
0, // prefetch size
false, // global
)
forever := make(chan bool)
go func() {
for {
msgs, _ := ch.Consume(
q.Name, // queue
"", // consumer
false, // ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
d.Ack(true)
}
time.Sleep(1 * time.Second)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}
这个函数是从
go start_consumer()
这可能是我对通道如何工作的误解,但我虽然永远不会返回,因为它正在等待传递给它的值。
慕码人2483693
相关分类