ホームページ >バックエンド開発 >Golang >Go の `defer` ステートメントは、入力パラメータとして宣言された変数と名前付き結果パラメータとして宣言された変数にどのような影響を与えるのでしょうか?

Go の `defer` ステートメントは、入力パラメータとして宣言された変数と名前付き結果パラメータとして宣言された変数にどのような影響を与えるのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-25 20:11:12254ブラウズ

How Do Go's `defer` Statements Affect Variables Declared as Input Parameters vs. Named Result Parameters?

Golang で異なる方法で宣言された変数の遅延動作

名前付き結果パラメータを持つ関数は、defer ステートメントを使用すると、入力パラメータを持つ関数と比較して動作が異なります。この例では、次の違いを調べます。

package main

import (
    "fmt"
)

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

func c1() (i int) {
    defer func() { i++ }()
    return i
}

func c2() (i int) {
    defer func() { i++ }()
    return 2
}

func main() {
    fmt.Println(c(0)) // Prints 0
    fmt.Println(c1()) // Prints 1
    fmt.Println(c2()) // Prints 3
}

c(i int):

この場合、i は受信パラメーターです。戻り値は遅延関数が実行される前に評価されるため、戻り後に i をインクリメントしても効果はありません。

c1():

ここで、i は結果パラメーターです。 。 return i ステートメントは、i の値を戻り値に代入します。ただし、遅延関数は戻り変数を変更できます。この場合、遅延関数は i をインクリメントし、戻り値は 1 になります。

c2():

c1() と同様に、return 2 ステートメントi に 2 を代入します。ただし、この場合、遅延関数は return ステートメントの後に実行され、戻り値は 3 になります。

要約すると、Go で名前付き結果パラメータを操作する場合、遅延関数は変更できることを覚えておくことが重要です。 return ステートメントの後であっても、その値は返されます。この動作は Go 仕様で明示的に言及されており、必要に応じて戻り値を変更するために使用できます。

以上がGo の `defer` ステートメントは、入力パラメータとして宣言された変数と名前付き結果パラメータとして宣言された変数にどのような影響を与えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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