【发布时间】:2014-12-18 20:35:41
【问题描述】:
我相信我对正常用例中的 defer 理解得很好。比如这个问题Golang defer behavior中列出的那个。但是,当在不返回的 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()
这可能是我对通道如何工作的误解,但我永远不会返回,因为它正在等待传递给它的值。
【问题讨论】:
-
你到底在问什么?您期望什么行为以及正在发生什么?
-
很简单,deferred 语句在函数返回时执行。如果函数没有返回,则延迟语句不会执行。
标签: go