Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Struktur Terbenam Digantikan untuk Pewarisan Kaedah dalam Go?

Bolehkah Struktur Terbenam Digantikan untuk Pewarisan Kaedah dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-01 02:54:28888semak imbas

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

Struktur Terbenam dan Pewarisan Kaedah

Adakah terdapat alternatif kepada struct terbenam untuk kaedah pewarisan?

Ya, ada cara alternatif untuk mewarisi kaedah jenis tanpa menggunakan struct terbenam. Walau bagaimanapun, ia memerlukan pemahaman yang lebih mendalam tentang sistem jenis Go.

Struktur Terbenam

Dalam Go, membenamkan struct membolehkan anda mengakses medan dan kaedah struct terbenam seolah-olah ia adalah sebahagian daripada struct yang mengandungi. Ini ialah ciri berkuasa yang boleh digunakan untuk mencipta warisan antara jenis.

Gotcha

Apabila anda membenamkan struct, set kaedah bagi struct terbenam bukan secara automatik dinaikkan pangkat kepada struct yang mengandungi. Untuk mempromosikan kaedah, struct terbenam mestilah tanpa nama.

Promosi Kaedah

Promosi kaedah ialah ciri bahasa yang membenarkan kaedah daripada struct terbenam tanpa nama diakses seolah-olah mereka adalah kaedah struct yang mengandungi. Ini dicapai dengan mengikuti peraturan ini:

  • Jika medan tanpa nama mempunyai jenis T, kaedah digalakkan mempunyai penerima jenis T dan *T.
  • Jika medan tanpa nama mempunyai jenis *T , kaedah yang digalakkan mempunyai penerima jenis T atau *T.

Contoh

Pertimbangkan kod berikut:

<code class="go">type Props map[string]interface{}

func (p Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := Node{"test": "foo"}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>

Dalam ini contoh, struct Nod membenamkan struct tanpa nama jenis Props. Ini membolehkan kaedah GetString daripada Props dinaikkan pangkat kepada Node.

Pendekatan Alternatif

Pendekatan alternatif tanpa pembenaman ialah menggunakan penerima penuding. Dengan menghantar penuding kepada fungsi penerima, anda boleh mengakses medan dan kaedah struct asas tanpa perlu membenamkannya.

Contoh

Berikut ialah pelaksanaan alternatif menggunakan penerima penunjuk:

<code class="go">type Props map[string]interface{}

func (p *Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := &Node{Props{"test": "foo"}}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>

Dalam contoh ini, kami menggunakan penerima penunjuk untuk kaedah GetString. Ini membolehkan kami mengakses medan dan kaedah struct Props yang mendasari tanpa perlu membenamkannya.

Kesimpulan

Walaupun struct terbenam ialah alat yang berkuasa untuk pewarisan, mereka bukan selalu pilihan terbaik. Dalam kes di mana promosi kaedah tidak diingini atau perlu, menggunakan penerima penunjuk boleh memberikan alternatif yang lebih fleksibel dan berprestasi.

Atas ialah kandungan terperinci Bolehkah Struktur Terbenam Digantikan untuk Pewarisan Kaedah 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