Maison > développement back-end > Golang > Comment enregistrer les implémentations de packages Go sans créer de dépendances cycliques ?

Comment enregistrer les implémentations de packages Go sans créer de dépendances cycliques ?

Barbara Streisand
Libérer: 2024-12-29 14:01:10
original
185 Les gens l'ont consulté

How to Register Go Package Implementations Without Creating Cyclic Dependencies?

Enregistrement de packages dans Go sans dépendance cyclique

Lors de la conception d'une application Go, il est crucial d'éviter les dépendances cycliques entre les packages, où un package dépend d'un autre, qui à son tour dépend du premier. Cela peut survenir lors de la définition d'interfaces et de leurs implémentations sur plusieurs packages.

Question :

Comment pouvons-nous enregistrer les implémentations client sans créer de dépendance cyclique entre notre package central (avec l'interface client) et les packages contenant les implémentations (par exemple, UDPClient, TCPClient)?

Réponse :

La bibliothèque standard propose deux approches principales pour résoudre ce problème :

1. Sans registre central

Définissez l'interface client dans un package central. Pour l'implémentation, spécifiez explicitement l'implémentation souhaitée lors de l'instanciation des clients. Par exemple :

import (
    "hash/md5"
    "hash/sha256"
)

func main() {
    h1 := md5.New()
    h2 := sha256.New()
}
Copier après la connexion

2. Avec un registre central

Créez un mécanisme de registre dans lequel les implémentations s'enregistrent elles-mêmes. Cette approche est similaire à l’enregistrement spontané évoqué dans la question. Il est utilisé dans le package d'images, où divers décodeurs de formats d'image (par exemple, GIF, JPEG, PNG) s'enregistrent.

3. Registre personnalisé proposé

Introduire un package d'usine distinct qui fournit les méthodes NewClient() pour créer des clients. Ce package peut faire référence aux packages d'interface et d'implémentation sans provoquer de dépendance circulaire. Par exemple :

package pi

// Client represents the client interface.
type Client interface { ... }
Copier après la connexion
package pa

// UDPClient implements the Client interface.
type UDPClient struct { ... }
Copier après la connexion
package pb

// TCPClient implements the Client interface.
type TCPClient struct { ... }
Copier après la connexion
package pf

import (
    "pi"
    "pa"
    "pb"
)

// NewClient creates a client based on the implementation.
func NewClient(impl string) pi.Client {
    switch impl {
    case "udp":
        return &pa.UDPClient{}
    case "tcp":
        return &pb.TCPClient{}
    default:
        panic("Unsupported implementation")
    }
}
Copier après la connexion

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal