ホームページ  >  記事  >  バックエンド開発  >  Go で遅延関数は値を返すことができますか?

Go で遅延関数は値を返すことができますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-16 17:46:03773ブラウズ

Can Deferred Functions Return Values in Go?

Go の遅延関数からの値を返す

Go では、遅延関数を使用すると、現在の関数が終了した後にコードのブロックを実行できます。返品または終了。 defer 関数内で返されたパラメーターを変更することは可能ですが、新しい値のセットを返すことはできません。

次のコードを考えてみましょう。

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err // Attempt to return new values
        }
    }()
    panic("Report format not recognized.")
    // ...
}

このコードでは、defer関数はパニックが発生すると nil と err を返そうとします。ただし、遅延関数は値を返すことができないため、これは機能しません。代わりに、返されるパラメーター rep と err を defer 関数内で変更する必要があります。

さらに、コード内に型の不一致があります。パニックは文字列で発生しますが、型アサーションではエラーが予期されます。これにより、回復された値をエラーに変換しようとしたときに、プログラムが再びパニックを起こします。

コードを修正するには、以下を行う必要があります。

  1. から値を返そうとする試みを削除します。 defer 関数。
  2. 回復された値が正しく型アサートされていることを確認します。

修正されたコード:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // Find out the exact error type and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        // Invalidate rep
        rep = nil
    }
}()

これらの変更により、defer 関数はパニックが発生したときに err と rep が正しく設定されるようになり、呼び出し元の関数がエラーを適切に処理できるようになりました。

以上がGo で遅延関数は値を返すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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