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

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

DDD
Lepaskan: 2024-11-27 21:27:09
asal
696 orang telah melayarinya

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}
Salin selepas log masuk

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
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan