ホームページ  >  記事  >  バックエンド開発  >  Go のネストされた遅延関数とネストされていない遅延関数では、「recover()」の動作はどのように異なりますか?

Go のネストされた遅延関数とネストされていない遅延関数では、「recover()」の動作はどのように異なりますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-23 04:24:16985ブラウズ

How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?

入れ子になった遅延関数の Recovery() の制限について

Golang では、panic とcover はエラー処理と回復のためのメカニズムを提供します。 reverse() はパニック値を返すことでパニックの処理に役立ちますが、ネストされた遅延関数内では動作が変わります。

例 1: 単純な遅延関数

次のコード スニペットを考えてみましょう。 :

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer printRecover()

    panic("OMG!") // Recoverable panic
}

このコードは「OMG!」でパニックになります。そして、出力に示されているように、遅延 printRecover() 関数を使用してパニック値を正常に回復します。

Recovered: OMG!

例 2: ネストされた遅延関数

次に、 printRecover() を別の遅延関数でラップします:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer func() {
        printRecover()
    }()

    panic("OMG!") // Panic goes unrecoverable
}

この中でたとえば、パニックが回復不能になり、プログラムは次のメッセージでパニックします。

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60

違いを理解する

これら 2 つの例の違いは、回復方法にあります。 () と呼ばれます。 Golang 仕様によると:

  • recover() は、遅延関数によって直接呼び出されない場合、nil を返します。

例 1 では、printRecover() は、 deferred 関数を使用すると、パニック値を返すことができます。ただし、例 2 では、printRecover() が匿名関数によって呼び出され、その後遅延されます。これにより、recover() は遅延関数によって直接呼び出されないため nil を返します。

したがって、ネストされた遅延関数内でパニックを正常に回復するには、recover() を遅延関数から直接呼び出す必要があります。

以上がGo のネストされた遅延関数とネストされていない遅延関数では、「recover()」の動作はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。