Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Antara Muka Go Dilaksanakan dengan Kaedah Tidak Dieksport Merentas Pakej?

Bolehkah Antara Muka Go Dilaksanakan dengan Kaedah Tidak Dieksport Merentas Pakej?

DDD
DDDasal
2024-11-27 21:27:09611semak imbas

Can Go Interfaces Be Implemented with Unexported Methods Across Packages?

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!

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