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 サイトの他の関連記事を参照してください。