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

Benamkan Struct atau Penunjuk kepada Struct: Bila dan Mengapa?

Mary-Kate Olsen
Lepaskan: 2024-11-01 02:51:27
asal
816 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan