Mengakses Medan Struktur Peribadi Merentasi Pakej
Dalam Go, adalah amalan biasa untuk merangkum data menggunakan medan struct peribadi untuk menguatkuasakan penyembunyian data. Walau bagaimanapun, mungkin terdapat situasi yang perlu untuk mengakses medan peribadi ini daripada pakej lain, seperti untuk tujuan ujian kotak putih.
Pendekatan Berasaskan Refleksi (Go < 1.7)
Menggunakan refleksi, adalah mungkin untuk membaca medan struct peribadi dalam versi Go sebelum 1.7. Berikut ialah contoh:
import ( "fmt" "reflect" "github.com/other-package/foo" ) func readFoo(f *foo.Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
Pendekatan ini membolehkan anda membaca medan peribadi tetapi percubaan untuk mengubah suainya akan mengakibatkan panik.
Pendekatan Berasaskan Tidak Selamat (Go ≥ 1.7)
Dalam Go 1.7 dan lebih baru, pendekatan yang lebih langsung menggunakan pakej tidak selamat boleh digunakan untuk membaca dan mengubah suai medan struct persendirian. Walau bagaimanapun, kaedah ini tidak digalakkan kerana ia bergantung pada manipulasi penunjuk peringkat rendah dan boleh membawa kepada kerosakan ingatan dan isu lain dengan mudah. Berikut ialah contoh:
import ( "unsafe" "github.com/other-package/foo" ) func changeFoo(f *foo.Foo) { ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + unsafe.Sizeof(foo.Foo{}.x)) ptrToy := (**foo.Foo)(ptrTof) *ptrToy = nil }
Pendekatan Alternatif
Untuk mengekalkan enkapsulasi sambil memudahkan ujian kotak putih, pertimbangkan alternatif ini:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Medan Struktur Persendirian dalam Pakej Go Across?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!