go defer 関数にポインタを渡すと機能しない

WBOY
リリース: 2024-02-13 12:24:09
転載
638 人が閲覧しました

将指针传递给 go defer 函数不起作用

PHP プログラミングでは、ポインターが go defer 関数に渡されたときに機能しないことがあります。 PHP ではポインタは変数のメモリアドレスを格納するために使用され、ポインタを渡すことで関数内で元の変数の値を変更できます。ただし、 go defer 関数にポインターを渡すときに、元の変数を変更できない場合があります。これは、 go defer 関数が実行時に新しいゴルーチンを作成し、ポインターが別のメモリ空間を指している可能性があり、その結果、変数の値を正しく変更できないことが原因である可能性があります。したがって、PHP プログラミングでは、予期しない問題を避けるために、ポインターを go defer 関数に渡す際は注意して行う必要があります。

質問の内容

私のコードでは、numaddr を使用して defer ステートメントの後の num の変更を記録しようとしています

リーリー

しかし、num は 2 ではなく 1 と表示されます。なぜ defer 関数はアドレスの代わりに *numaddr の値を使用するのでしょうか?

じゃあ、別の方法を試してみましょう

リーリー

今回はうまくいきました。num は 2 だったので、おそらく defer fmt.printf(something) が宣言時にすぐに文字列を保存したのではないかと思いました。そして、numaddr ではありませんでした。 defer 関数が実際に実行されるときに使用されますか?

解決策

興味深い質問です。この質問に答えるには、この go チュートリアル https://go.dev/tour/flowcontrol/12

のようなルールを知っておく必要があります。

遅延呼び出しのパラメーターはすぐに評価されますが、関数呼び出しは周囲の関数が戻るまで実行されません。

例 1: defer 関数に、指定されたメモリ アドレスにある値を出力するように指示します。

リーリー

出力は 2 になります。

例 2: defer 関数に指定された値を出力するように指示します。

リーリー

出力は 1 になります。

以上がgo defer 関数にポインタを渡すと機能しないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!