Go でのポインターによる値の変更を理解する
Go では、ポインターを使用して値の間接的なアクセスと変更が可能です。ただし、ポインタを関数に渡すときは、ポインタがどのように機能するかを理解することが重要です。
ポインタを関数に渡すとき、値の変更とポインタの再割り当てという 2 つのシナリオが発生します。
シナリオ 1 : 値の変更
次のコードを考えてみましょう:
<code class="go">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} }</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 = &i f(p) println(i.Value) // 2 } func f(p *Test) { // ? p = &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 = &i f(p) println(i.Value) // 4 } func f(p *Test) { p.Value = 4 }</code>
p.Value を使用して、元の構造体の Value フィールドを変更します。 、結果として出力は 4.
以上がポインターは Go 関数の値の変更にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。