ホームページ >バックエンド開発 >Golang >ポインターは Go 関数の値の変更にどのように影響しますか?

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 02:32:02647ブラウズ

How do pointers affect value modification in Go functions?

Go でのポインターによる値の変更を理解する

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

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

シナリオ 1 : 値の変更

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

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

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

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

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

ここでコードを少し変更してみましょう:

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

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

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

解決策: Pointed を変更するValue

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

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

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

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

以上がポインターは Go 関数の値の変更にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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