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

ポインターは Go 関数の値の変更にどのように影響しますか?

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

How do pointers affect value modification in Go functions?

Go でのポインターによる値の変更について

Go では、ポインターを使用して値の間接的なアクセスと変更が可能です。ただし、ポインタを関数に渡すときは、ポインタがどのように機能するかを理解することが重要です。

ポインタを関数に渡すときは、値の変更とポインタの再割り当てという 2 つのシナリオが発生します。

シナリオ 1 : 値の変更

次のコードを考えてみましょう:

type Test struct { Value int }

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

ここで、関数 f は Test 構造体へのポインターを受け取ります。 f 内では、逆参照されたポインター (*p) に値 4 の新しい Test 構造体が割り当てられます。これにより、main 関数内の元の i 構造体が効果的に変更され、出力は 4.

シナリオ2: ポインターの再割り当て

次に、コードを少し変更しましょう:

type Test struct { Value int }

func main() {
   var i Test = Test {2}
   var p *Test = &i
   f(p)
   println(i.Value)  // 2
}
func f(p *Test) {
   // ?
   p = &Test{4}
}

この場合、関数はポイントされた値を変更する代わりに、値 4 を持つ新しい Test 構造体に p ポインターを再割り当てします。p は f 内のローカル変数であるため、この変更は元の i struct は main 関数にあり、出力は 2 のままです。

解決策: ポイントされた値の変更

ポイントされた値を変更するには、ポインタを逆参照して直接行う必要があります。構造体メンバーにアクセスします:

type Test struct { Value int }

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

p.Value を使用して、元の構造体の Value フィールドを変更し、出力は 4.

になります。
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3