Rumah >pembangunan bahagian belakang >Golang >Struktur Terbenam dalam Go: Bila Perlu Dibenamkan mengikut Nilai lwn. dengan Penunjuk?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 19:34:301074semak imbas

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>

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>

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>

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>

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!

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