在 Go 例程中调用 Defer

我相信我对正常用例中的 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()

这可能是我对通道如何工作的误解,但我虽然永远不会返回,因为它正在等待传递给它的值。


温温酱
浏览 207回答 1
1回答

慕码人2483693

上一个问题中引用的 Go 博客的Defer、Panic 和 Recover帖子很好地解释了 defer 语句的工作原理。defer 语句将函数调用推送到列表上。保存的调用列表在周围函数返回后执行。Defer 通常用于简化执行各种清理操作的函数。在您的情况下,由于 goroutine 不返回,因此永远不会运行延迟调用列表。这使得 defer 语句在这种情况下是不必要的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go