Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Mary-Kate Olsenasal
2024-11-03 08:27:30751semak imbas

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

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

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

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

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

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!

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