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!