名前付きリターンが呼び出し元に与えるパニックを通常のリターンが隠す理由
Go では、通常のリターン ステートメントと名前付きリターン ステートメントの両方が使用されます関数から値を返すため。ただし、関数がパニックしたときの動作には微妙な違いがあります。
通常の戻りでは、関数が呼び出されたときに戻り値はゼロ値に初期化されます。 return ステートメントに到達する前に関数がパニックになった場合、戻り値はゼロ値のままになります。たとえば、関数がエラー値を返した場合、関数がパニックになった場合、通常の戻り値は常に nil を返します。
対照的に、名前付き戻り値では、遅延関数または関数自体によって戻り値を変更することができます。関数は呼び出し元に戻ります。名前付き戻り値を持つ関数がパニックになった場合、遅延関数は、関数が呼び出し元に戻る前に戻り値を変更できます。
この違いは、次の例で説明できます。
package main import ( "fmt" "log" ) func catch(err *error) { if r := recover(); r != nil { *err = fmt.Errorf("recovered panic: %v", r) } } func panicIf42(n int) { if n == 42 { panic("42!") } } func NormalReturns(n int) error { var err error defer catch(&err) panicIf42(n) return err } func NamedReturns(n int) (err error) { defer catch(&err) panicIf42(n) return } func main() { err := NamedReturns(42) log.Printf("NamedReturns error: %v", err) err = NormalReturns(42) log.Printf("NormalReturns error: %v", err) }
出力このプログラムの内容は次のとおりです。
2009/11/10 23:00:00 NamedReturns error: recovered panic: 42! 2009/11/10 23:00:00 NormalReturns error: <nil>
ご覧のとおり、名前付き戻り値は非 nil エラーを返しますが、通常の戻り値は nil を返します。これは、NamedReturns 関数の遅延 catch 関数が、関数が呼び出し元に戻る前に err 戻り値を変更するためです。
この動作は、プログラム全体で一貫した方法でエラーを処理するのに役立ちます。名前付き return を使用すると、関数が return ステートメントに到達する前にパニックが発生した場合でも、パニックが発生した場合にすべての関数が nil 以外のエラーを返すようにすることができます。
以上が関数がパニックになった場合、Go の名前付き戻り値と通常の戻り値はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。