Membenamkan Struct atau Penunjuk kepada Struct sebagai Penunjuk: Perbezaan Utama
Apabila jenis struct A bertindak sebagai penunjuk dengan hanya penerima penunjuk dan pembina mengembalikan A,membenamkan jenis struct lain B memberikan dua pilihan: membenamkan B secara langsung atau membenamkan B.
Perbezaan Nilai Sifar:
Nilai sifar daripada A dengan tertanam B berbanding tertanam *B berbeza. Apabila B dibenamkan secara langsung, nilai sifar A mengandungi nilai sifar tertanam B, membenarkan penggunaan selamat tanpa permulaan:
<code class="go">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</code>
Walau bagaimanapun, membenamkan nilai penunjuk sifar dalam nilai sifar APtr menjadikan penggunaan langsung mustahil:
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // panics</code>
Penyalinan Objek:
Objek disalin seperti yang diharapkan. Mencipta AObj baharu menyalin B tertanam:
<code class="go">aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to the copy</code>
Sebaliknya, mencipta APtr baharu menyalin *B, mengekalkan objek konkrit yang dikongsi:
<code class="go">aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, due to shared reference</code>
Contoh:
https://play.golang.org/p/XmOgegwVFeE menyediakan contoh yang boleh dijalankan yang menunjukkan perbezaan ini.
Atas ialah kandungan terperinci Benamkan Struct atau Penunjuk kepada Struct: Bila dan Mengapa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!