Rumah > pembangunan bahagian belakang > Golang > Bila hendak Membenamkan Penunjuk pada Struct vs. Struct Itu Sendiri dalam Go?

Bila hendak Membenamkan Penunjuk pada Struct vs. Struct Itu Sendiri dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-03 08:27:30
asal
832 orang telah melayarinya

When to Embed a Pointer to a Struct vs. the Struct Itself in Go?

Membenamkan Penunjuk pada Struct lwn. Membenamkan Struct Itu Sendiri

Dalam senario yang diberikan, di mana jenis struct A digunakan sebagai penunjuk dan semata-mata mengandungi penerima penunjuk, wujud perbezaan antara membenamkan jenis struct B sebagai B berbanding *B.

Tingkah Laku Nilai Sifar

Perbezaan yang paling ketara terletak pada nilai sifar struktur terhasil. Apabila membenamkan B sebagaimana adanya, nilai sifar jenis A akan termasuk objek jenis B yang dibenamkan, yang juga memegang nilai sifarnya. Ini membolehkan penggunaan medan terbenam yang lancar tanpa permulaan awal:

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

Sebaliknya, pembenaman *B menghasilkan nilai sifar dengan penuding sifar, menghalang akses medan langsung:

type APtr struct {
    *B
}

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

Menyalin Medan

Apabila mencipta objek baharu jenis A, kelakuan penyalinan medan sejajar dengan gerak hati. Benamkan B secara langsung mencipta salinan objek terbenam dalam objek baharu, mengekalkan kebebasan:

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0, due to a separate instance of B
Salin selepas log masuk

Sebaliknya, membenamkan *B mencipta salinan penuding dan bukannya objek konkrit yang mendasarinya. Ini bermakna kedua-dua objek berkongsi tika B yang sama, memberi kesan kepada pengubahsuaian medan:

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1, as both objects point to the same B
Salin selepas log masuk

Secara asasnya, pembenaman B mencipta kejadian yang berbeza bagi struct terkandung, manakala membenamkan *B berkongsi tika konkrit tunggal merentas berbilang struktur terbenam . Perbezaan ini mempengaruhi kedua-dua semantik nilai sifar dan kelakuan penyalinan medan.

Atas ialah kandungan terperinci Bila hendak Membenamkan Penunjuk pada Struct vs. Struct Itu Sendiri dalam Go?. 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