为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 例程中调用 Defer

在 Go 例程中调用 Defer

Go
温温酱 2021-09-10 10:42:23
我相信我对正常用例中的 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 语句在这种情况下是不必要的。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信