Membenamkan Penunjuk pada Struct lwn. Membenamkan Struct Itu Sendiri
Dalam senario yang diberikan, di mana jenis struct A digunakan sebagai penunjuk dan semata-mata mengandungi penerima penunjuk, wujud perbezaan antara membenamkan jenis struct B sebagai B berbanding *B.
Tingkah Laku Nilai Sifar
Perbezaan yang paling ketara terletak pada nilai sifar struktur terhasil. Apabila membenamkan B sebagaimana adanya, nilai sifar jenis A akan termasuk objek jenis B yang dibenamkan, yang juga memegang nilai sifarnya. Ini membolehkan penggunaan medan terbenam yang lancar tanpa permulaan awal:
type B struct { X int } func (b *B) Print() { fmt.Printf("%d\n", b.X) } type AObj struct { B } var aObj AObj aObj.Print() // prints 0
Sebaliknya, pembenaman *B menghasilkan nilai sifar dengan penuding sifar, menghalang akses medan langsung:
type APtr struct { *B } var aPtr APtr aPtr.Print() // panics
Menyalin Medan
Apabila mencipta objek baharu jenis A, kelakuan penyalinan medan sejajar dengan gerak hati. Benamkan B secara langsung mencipta salinan objek terbenam dalam objek baharu, mengekalkan kebebasan:
aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to a separate instance of B
Sebaliknya, membenamkan *B mencipta salinan penuding dan bukannya objek konkrit yang mendasarinya. Ini bermakna kedua-dua objek berkongsi tika B yang sama, memberi kesan kepada pengubahsuaian medan:
aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, as both objects point to the same B
Secara asasnya, pembenaman B mencipta kejadian yang berbeza bagi struct terkandung, manakala membenamkan *B berkongsi tika konkrit tunggal merentas berbilang struktur terbenam . Perbezaan ini mempengaruhi kedua-dua semantik nilai sifar dan kelakuan penyalinan medan.
Atas ialah kandungan terperinci Bila hendak Membenamkan Penunjuk pada Struct vs. Struct Itu Sendiri dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!