Maison > développement back-end > Golang > Les interfaces Go peuvent-elles être implémentées avec des méthodes non exportées dans tous les packages ?

Les interfaces Go peuvent-elles être implémentées avec des méthodes non exportées dans tous les packages ?

DDD
Libérer: 2024-11-27 21:27:09
original
633 Les gens l'ont consulté

Can Go Interfaces Be Implemented with Unexported Methods Across Packages?

Implémentation d'interfaces avec des méthodes non exportées dans les packages

Dans Go, l'implémentation d'une interface nécessite généralement de définir des méthodes exportées qui correspondent à la signature de l'interface. Cependant, il existe des scénarios dans lesquels le maintien de l'accessibilité de l'implémentation n'est pas souhaitable. Cet article explore la faisabilité d'implémenter des interfaces avec des méthodes non exportées dans des packages séparés.

Considérez l'extrait de code suivant, où l'implémentation du système comptable (accountingsystem) est cachée dans un type non exporté :

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}
Copier après la connexion

Malheureusement, cette approche génère une erreur de compilation, car la méthode getInvoice() non exportée du package du système de comptabilité n'est pas visible par la comptabilité. package.

Approches alternatives

Champs de structure anonymes :

Une solution consiste à implémenter l'interface à l'aide d'un champ de structure anonyme dans le package de l’interface. Cela permet de satisfaire l'interface sans exposer l'implémentation :

package accounting

type IAdapter interface {
    GetInvoice() error
}

type Adapter struct {
    IAdapter
}

func (*Adapter) GetInvoice() error {
    // Custom implementation
}
Copier après la connexion

Fonction de configuration :

Vous pouvez également créer une fonction distincte pour configurer l'adaptateur en vous inscrivant le type non exporté comme adaptateur :

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()
}
Copier après la connexion

Cette approche vous permet de garder le type de l'adaptateur privé tout en déléguant le processus d'enregistrement à une autre fonction.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal