Rumah >pembangunan bahagian belakang >Golang >Bolehkah Kaedah Go Terbenam Mengakses Medan Struktur Induk?

Bolehkah Kaedah Go Terbenam Mengakses Medan Struktur Induk?

DDD
DDDasal
2024-12-06 08:02:11177semak imbas

Can Embedded Go Methods Access Parent Struct Fields?

Bolehkah Kaedah Terbenam Mengakses Medan Induk?

Dalam Go, kaedah terbenam ialah mekanisme yang berkuasa untuk penggunaan semula dan organisasi kod. Walau bagaimanapun, persoalan biasa timbul: bolehkah kaedah terbenam boleh mengakses terus medan struct induknya?

Latar Belakang

Untuk konteks, katakan anda sedang mencipta Rekod Aktif- gaya ORM untuk Pergi di mana kaedah CRUD biasa dibenamkan dalam struct pengguna untuk kebolehbacaan dan pengabstrakan. Ini membolehkan anda menulis user.Save() dan bukannya data.Save(user).

Contoh

Pertimbangkan coretan kod ini:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    test := Foo{Bar: &Bar{}, Name: "name"}
    test.Test()
}

type Foo struct {
    *Bar
    Name string
}

func (s *Foo) Method() {
    fmt.Println("Foo.Method()")
}

type Bar struct {
}

func (s *Bar) Test() {
    t := reflect.TypeOf(s)
    v := reflect.ValueOf(s)
    fmt.Printf("model: %+v %+v %+v\n", s, t, v)
    fmt.Println(s.Name)
    s.Method()
}

Soalan Disemak Semula

Persoalan yang timbul ialah sama ada terdapat cara untuk menjadikan medan peringkat atas boleh diakses daripada kaedah terbenam. Dalam contoh di atas, kaedah Ujian dibenamkan dalam Bar dan cuba mengakses medan Nama daripada struct Foo induk.

Jawapan

Malangnya, Go tidak memberikan sebarang mekanisme langsung untuk kaedah terbenam untuk mengakses medan struct induk mereka. Penerima kaedah Ujian ialah penunjuk kepada Bar dan tiada cara untuk Go menentukan sama ada ia dibenamkan atau tidak.

Penyelesaian Kemungkinan

Untuk mencapai kefungsian ini, satu penyelesaian yang berpotensi ialah menambah ahli antara muka{} pada struktur Bar, yang memerlukan jenis yang melaksanakannya menetapkan ahli kepada jenis yang mengandungi. Permulaan ahli ini sama ada boleh menjadi tanggungjawab pemanggil atau dikendalikan melalui kaedah ORM. Walau bagaimanapun, pendekatan ini memperkenalkan kerumitan tambahan dan isu penyelenggaraan yang berpotensi.

Perspektif Alternatif

Sebagai alternatif, pertimbangkan kemungkinan penstrukturan API sebagai db.Save(user) mungkin tidak memudaratkan seperti yang kelihatan. Pendekatan ini menawarkan cara yang mudah untuk menyokong berbilang pangkalan data dan mengelak bergantung pada keadaan global.

Atas ialah kandungan terperinci Bolehkah Kaedah Go Terbenam Mengakses Medan Struktur Induk?. 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