Struktur Terbenam dalam Go: Bila Perlu Dibenamkan mengikut Nilai lwn. dengan Penunjuk?

Mary-Kate Olsen
Lepaskan: 2024-11-02 19:34:30
asal
1042 orang telah melayarinya

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Struktur Terbenam dalam Go: Penunjuk lwn. Objek

Apabila berurusan dengan penerima penuding dan membina jenis penuding, memahami perbezaan antara membenamkan struktur sebagai objek (B) berbanding penunjuk (*B) menjadi penting. Dalam konteks ini, nilai sifar bagi kedua-dua jenis struct terbenam ini berbeza dengan ketara.

Pembenaman Terus (Objek)

Jika struct B dengan penerima penuding dibenamkan terus sebagai objek dalam struct A, nilai sifarnya termasuk objek terbenam jenis B, yang dengan sendirinya mempunyai nilai sifar. Pembangun boleh mengakses objek terbenam ini dan kaedahnya dengan selamat.

<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

Pembenaman Penunjuk

Sebaliknya, membenamkan penuding ke B (*B) mencipta senario berbeza . Nilai sifar struct terbenam ini mempunyai nilai penunjuk sifar, menjadikannya tidak boleh digunakan secara langsung.

<code class="go">type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics</code>
Salin selepas log masuk

Penyalinan Objek

Apabila objek AObj dicipta, ia memperoleh salinan objek B terbenam. Pengubahsuaian yang dibuat pada salinan tidak menjejaskan objek asal.

<code class="go">aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0</code>
Salin selepas log masuk

Menyalin Penunjuk

Dengan APtr, mencipta objek baharu menyalin penunjuk (*B) tetapi bukan objek konkrit asas yang ditunjuk. Oleh itu, pengubahsuaian pada objek baharu menjejaskan kedua-dua objek asal dan baharu.

<code class="go">aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1</code>
Salin selepas log masuk

Adalah penting untuk mempertimbangkan kes penggunaan dan keperluan khusus apabila menentukan sama ada untuk membenamkan struct sebagai objek atau penunjuk. Keputusan ini boleh memberi kesan kepada permulaan sifar, gelagat penyalinan dan pemilikan objek, antara faktor lain.

Atas ialah kandungan terperinci Struktur Terbenam dalam Go: Bila Perlu Dibenamkan mengikut Nilai lwn. dengan Penunjuk?. 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