Rumah > Artikel > pembangunan bahagian belakang > Bolehkah Antara Muka Go Dilaksanakan dengan Kaedah Tidak Dieksport Merentas Pakej?
Melaksanakan Antara Muka dengan Kaedah Tidak Dieksport Merentasi Pakej
Dalam Go, melaksanakan antara muka biasanya memerlukan penentuan kaedah yang dieksport yang sepadan dengan tandatangan antara muka. Walau bagaimanapun, terdapat senario di mana mengekalkan kebolehcapaian pelaksanaan adalah tidak diingini. Artikel ini meneroka kemungkinan melaksanakan antara muka dengan kaedah yang tidak dieksport dalam pakej berasingan.
Pertimbangkan coretan kod berikut, di mana pelaksanaan sistem perakaunan (sistem perakaunan) tersembunyi di dalam jenis yang tidak dieksport:
package accounting import "errors" type IAdapter interface { getInvoice() error } var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.getInvoice() } package accountingsystem type Adapter struct {} func (a Adapter) getInvoice() error {return nil}
Malangnya, pendekatan ini menghasilkan ralat penyusunan, kerana kaedah getInvoice() yang tidak dieksport daripada pakej sistem perakaunan tidak kelihatan kepada pakej perakaunan.
Pendekatan Alternatif
Medan Struktur Tanpa Nama:
Satu penyelesaian adalah untuk melaksanakan antara muka menggunakan medan struct tanpa nama dalam pakej antara muka. Ini membolehkan untuk memuaskan antara muka tanpa mendedahkan pelaksanaan:
package accounting type IAdapter interface { GetInvoice() error } type Adapter struct { IAdapter } func (*Adapter) GetInvoice() error { // Custom implementation }
Fungsi Persediaan:
Sebagai alternatif, anda boleh mencipta fungsi berasingan untuk menyediakan penyesuai dengan mendaftar jenis yang tidak dieksport sebagai penyesuai:
package accounting type IAdapter interface { GetInvoice() error } package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) } package main func main() { accountingsystem.SetupAdapter() }
Pendekatan ini membolehkan anda mengekalkan jenis penyesuai secara peribadi semasa menugaskan proses pendaftaran kepada fungsi lain.
Atas ialah kandungan terperinci Bolehkah Antara Muka Go Dilaksanakan dengan Kaedah Tidak Dieksport Merentas Pakej?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!