ホームページ >バックエンド開発 >Golang >関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?

関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?

WBOY
WBOY転載
2024-02-06 10:15:111040ブラウズ

関数の引数として渡されたポインターが変更されているかどうか、またはコピーが変更されているかどうかを確認するにはどうすればよいですか?

質問内容

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 関数はポインタのコピーを変更するのはなぜですか?

initialfinal の関数パラメータは、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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。