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
DDDoriginal
2024-11-27 21:27:09685parcourir

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}

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
}

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()
}

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!

Déclaration:
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