package main import ( "fmt" ) type Numbers struct { x int y int } func initial(number *Numbers) { number.x = 1 number.y = 1 } func final(number *Numbers) { number = &Numbers{2, 2} } func main() { p := Numbers{0, 0} fmt.Println(p) //Prints {0 0} initial(&p) fmt.Println(p) //Prints {1 1} final(&p) fmt.Println(p) //Expected to print {2, 2} but prints {1, 1} }
initial
関数はポインタを変更し、final
関数はポインタのコピーを変更するのはなぜですか?
initial
と final
の関数パラメータは、main
; initial## の
p のメモリ アドレスを指します。
#p は変更できますが、
final は変更できません。
## です。ただし、使いやすさを考慮して、Go は場合によっては暗黙的に逆参照操作を挿入します。たとえば、
number.x = 1 は
(*number).x = 1 に変換されます。
number はポインター型であるため、式
number.x = 1 は無意味になることがわかります。 、ポインターにはフィールドがありません。
initial 関数には暗黙的なポインター逆参照がありますが、
final にはありません。
final を明示的かつ正確に逆参照するように変更すると、
*number = Numbers{2, 2} となり、
p も変更されます。
以上が関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。