Benamkan Struct atau Penunjuk kepada Struct: Bila dan Mengapa?

Mary-Kate Olsen
Lepaskan: 2024-11-01 02:51:27
asal
642 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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!