Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Benamkan Struct atau Penunjuk kepada Struct: Bila dan Mengapa?

Benamkan Struct atau Penunjuk kepada Struct: Bila dan Mengapa?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 02:51:27625semak imbas

Embed a Struct or a Pointer to a Struct: When and Why?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn