「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go 関数でのポインターの変更が元の値に影響を与えないことがあるのはなぜですか?

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

2024 年 11 月 7 日に公開
ブラウズ:377

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

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

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}
}

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

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}
}

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

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

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

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
}

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

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3