ホームページ > バックエンド開発 > Golang > Go で「defer」を使用すると、その後の変更にもかかわらず変数の初期値が出力されるのはなぜですか?

Go で「defer」を使用すると、その後の変更にもかかわらず変数の初期値が出力されるのはなぜですか?

Linda Hamilton
リリース: 2024-12-29 07:01:09
オリジナル
499 人が閲覧しました

Why Does `defer` in Go Print the Initial Value of a Variable Despite Subsequent Changes?

遅延使用法の明確化

実行を遅延する関数を使用する場合、遅延時のパラメーターの評価を考慮することが重要です。文書化されているように、「defer」はステートメントの実行時に評価された関数の値とパラメーターを保存します。

初期アプローチ

提供されたコードでは、単純なループを使用して変数 x をインクリメントします。ただし、遅延された fmt.Println(x) が実行されると、変数 x がループ内で複数回インクリメントされたにもかかわらず、ゼロが出力されます。これは、x が実際に呼び出されるときではなく、遅延が実行されるときに評価されるためです。

代替ソリューション

1) 匿名関数:

匿名関数を導入すると、現在の関数のパラメーターから分離できます。匿名関数が実行されると、x の更新された値にアクセスして出力します。

2) ポインター:

ポインターを使用すると、x を指します。 defer ステートメントの実行時に x は評価されず、x のアドレスのみが評価されます。このアプローチでは、指定された値を手動で出力するヘルパー関数が必要です。

3) カスタム タイプ:

カスタム String() メソッドを使用してカスタム タイプを作成すると、高いパフォーマンスが得られます。 -level ポインターの値にアクセスする方法。このカスタム タイプのオブジェクトで fmt.Println() を使用すると、自動的に String() メソッドが呼び出され、必要な値が取得されます。

4) ラッピング:

defer ステートメント中に x をスライスにラップすると、基になる配列を指す記述子が生成されます。 fmt.Println() を使用してスライスを印刷すると、x の更新された値がアクセスされて印刷されます。これを配列などの型に拡張することで、指定された内容を出力することが可能になります。

以上がGo で「defer」を使用すると、その後の変更にもかかわらず変数の初期値が出力されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート