ホームページ > バックエンド開発 > Golang > 関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?

関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?

WBOY
リリース: 2024-02-06 10:15:11
転載
1058 人が閲覧しました

関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?

質問内容

package main

import (
    "fmt"
)

type Numbers struct {
    x int
    y int
}

func initial(number *Numbers) {
    number.x = 1
    number.y = 1
}

func final(number *Numbers) {
    number = &Numbers{2, 2}
}

func main() {
    p := Numbers{0, 0}
    fmt.Println(p) //Prints {0 0}

    initial(&p)
    fmt.Println(p) //Prints {1 1}

    final(&p)
    fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}
ログイン後にコピー

initial 関数はポインタを変更し、final 関数はポインタのコピーを変更するのはなぜですか?

initialfinal の関数パラメータは、main; initial## の p のメモリ アドレスを指します。 #p は変更できますが、final は変更できません。

なぜこれが起こっているのかについての説明をいただければ幸いです。


正解


ポインタが指すデータを変更するには、ポインタを逆参照する必要があります。逆参照演算子は

## です。ただし、使いやすさを考慮して、Go は場合によっては暗黙的に逆参照操作を挿入します。たとえば、number.x = 1(*number).x = 1 に変換されます。

この暗黙的な変換は混乱を招く可能性がありますが、変換が行われなかった場合、

number はポインター型であるため、式 number.x = 1 は無意味になることがわかります。 、ポインターにはフィールドがありません。

要約すると、

initial 関数には暗黙的なポインター逆参照がありますが、final にはありません。

final を明示的かつ正確に逆参照するように変更すると、*number = Numbers{2, 2} となり、p も変更されます。

以上が関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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