ホームページ  >  記事  >  バックエンド開発  >  Go 関数でのポインターの変更が元の値に影響を与えないことがあるのはなぜですか?

Go 関数でのポインターの変更が元の値に影響を与えないことがあるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 11:30:30747ブラウズ

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Go でのポインタの変更、違いを理解する

Go では、ポインタを関数に渡すとき、通常は値を変更することを目的としています。そのポインタが指す。通常、これは、次のコードに示すように、逆参照によって実現できます。

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}</code>

ただし、渡されたポインタが指す構造体の値が、変更後であっても変更されない場合があります。関数内で。これが発生する理由を理解するために、変更されたコード スニペットを調べてみましょう。

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}</code>

このコード スニペットは、ポインタ値 p を変更しようとしますが、最初に指されていた構造体の値を変更できません。その理由は、f() 関数内の代入 p = &Test{4} はローカル変数 p の値のみを変更するためです。

f() 関数内では、p はローカル変数として扱われます。新しい値を代入しても、main() 関数から渡されるポインターの値には影響しません。その結果、p が指す構造体は変更されず、印刷時に i.Value の変更されていない値に反映されます。

対照的に、次のコードは、構造体の値を変更するための正しいアプローチを示しています。

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}</code>

このコードでは、p.Value = 4 は、p が指す構造体の Value フィールドを直接変更します。これにより、構造体の値が適切に変更され、印刷時に i.Value の更新された値に反映されます。

(p = &Test{ のように) ポインター自体に新しい値を割り当てることは注目に値します。 4}) は異なる効果をもたらします。この代入により、新しい構造体を指す新しいポインターが作成されますが、main() 関数から渡された元のポインターが指す構造体の値には影響しません。

以上がGo 関数でのポインターの変更が元の値に影響を与えないことがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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