我相信我对正常用例中的 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()这可能是我对通道如何工作的误解,但我虽然永远不会返回,因为它正在等待传递给它的值。
1 回答
慕码人2483693
TA贡献1860条经验 获得超9个赞
上一个问题中引用的 Go 博客的Defer、Panic 和 Recover帖子很好地解释了 defer 语句的工作原理。
defer 语句将函数调用推送到列表上。保存的调用列表在周围函数返回后执行。Defer 通常用于简化执行各种清理操作的函数。
在您的情况下,由于 goroutine 不返回,因此永远不会运行延迟调用列表。这使得 defer 语句在这种情况下是不必要的。
- 1 回答
- 0 关注
- 206 浏览
添加回答
举报
0/150
提交
取消