Go でのポインターによる値の変更
Go では、ポインターを関数に渡すことで、ポイントされた値を直接操作できます。ただし、ポインターに値を割り当てる場合は、考慮すべきニュアンスがいくつかあります。
値を変更せずにポインターを割り当てる
次のコードを考えてみましょう:
<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) { // Assigning a new pointer value p = &Test{4} }</code>
このコードでは、p は i 構造体へのポインタです。 f 関数内で、新しいポインター値を p に代入しても、i の値は変更されません。これは、p が f 内のローカル変数であり、その値の変更はローカル コピーにのみ影響するためです。
ポイントされた値の変更
i の値を実際に変更するには、次のようにします。ポイントされた構造体の値を変更する必要があります。これは逆参照演算子 (*) を使用して実行できます。例:
<code class="go">func f(p *Test) { p.Value = 4 }</code>
ここで、p.Value はポインター p を逆参照し、ポイントされた構造体の Value フィールドに値 4 を割り当てます。この変更は、f が返されるときに i に反映されます。
ポインターへのポインターの代入
または、関数 f 内でポインター自体を変更することもできます。ただし、これにはポインタ変数 (&p) のアドレスを f に渡す必要があります。
<code class="go">func f(p **Test) { *p = &Test{4} }</code>
この場合、*p はダブルポインタ p を逆参照し、新しいポインタ値を割り当てて、p 変数を効果的に変更します。メインで。ただし、このアプローチは単純ではなく、ポイントされた値を直接変更するよりも効率が劣る可能性があります。
結論
関数にポインターを渡す場合、関数を理解することが重要です。新しいポインターの割り当て (p = &Test{4}) と、ポイントされた値の変更 (p.Value = 4) の違い。後者のアプローチでは構造体の値を直接操作できますが、前者のアプローチではポインター自体が変更されるだけです。
以上がGo 関数のポインターを使用して値を変更するにはどうすればよいですか?また、さまざまなアプローチには何がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。