ホームページ >バックエンド開発 >Golang >Go では「defer」ステートメントと名前付き戻り値がどのように相互作用しますか?

Go では「defer」ステートメントと名前付き戻り値がどのように相互作用しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 18:23:09954ブラウズ

How Do `defer` Statements and Named Return Values Interact in Go?

Go の defer と名前付き戻り値について

Go では、defer ステートメントを使用すると、周囲の関数が戻った後に関数がコードを実行できます。この動作を使用して、周囲の関数の名前付き戻り値を変更できます。

次の例を考えてみましょう:

func c() (i int) {
    defer func() { i++ }()
    return 1
}

この関数は、return 1 ステートメントが使用されているにもかかわらず、2 を返します。これは、defer ステートメントが関数呼び出しをスタックにプッシュし、周囲の関数が戻る直前に実行されるためです。したがって、i ステートメントは return 1 ステートメントの後に実行され、i の値が 2 に増加します。

Naked Returns について

「Naked Returns」を明確にすることが重要です。 Go の "return" は、引数のない return ステートメントを指します。このような場合、名前付き戻り値は、明示的に割り当てられずに返されます。

func a() (i int) {
    i = 2
    return
}

裸の return ステートメントは、以前に 2 に割り当てられている名前付き戻り値 i を返すため、この関数は 2 を返します。

Defer と Non-Naked Returns の組み合わせ

関数 c の例では、 defer ステートメントは、return 1 ステートメントの実行後に名前付き戻り値 i を変更します。これは事実上、次のコードと同等です:

func c() (i int) {
    i = 1
    defer func() { i++ }()
}

この場合、return ステートメントは依然として 1 を返しますが、defer ステートメントは関数が戻る前に i の値をインクリメントします。

以上がGo では「defer」ステートメントと名前付き戻り値がどのように相互作用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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