Heim >Backend-Entwicklung >Golang >Wie registriere ich Go-Paketimplementierungen, ohne zyklische Abhängigkeiten zu erstellen?

Wie registriere ich Go-Paketimplementierungen, ohne zyklische Abhängigkeiten zu erstellen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-29 14:01:10209Durchsuche

How to Register Go Package Implementations Without Creating Cyclic Dependencies?

Pakete in Go ohne zyklische Abhängigkeit registrieren

Beim Entwerfen einer Go-Anwendung ist es wichtig, zyklische Abhängigkeiten zwischen Paketen zu vermeiden, bei denen ein Paket abhängig ist auf einem anderen, der wiederum vom ersten abhängt. Dies kann auftreten, wenn Schnittstellen und deren Implementierungen über mehrere Pakete hinweg definiert werden.

Frage:

Wie können wir Client-Implementierungen registrieren, ohne eine zyklische Abhängigkeit zwischen unserem zentralen Paket (mit die Client-Schnittstelle) und die Pakete, die die Implementierungen enthalten (z. B. UDPClient, TCPClient)?

Antwort:

Die Standardbibliothek bietet zwei Hauptansätze, um dieses Problem anzugehen:

1. Ohne zentrale Registry

Definieren Sie die Client-Schnittstelle in einem zentralen Paket. Geben Sie für die Implementierung beim Instanziieren von Clients explizit die gewünschte Implementierung an. Zum Beispiel:

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

func main() {
    h1 := md5.New()
    h2 := sha256.New()
}

2. Mit einer zentralen Registrierung

Erstellen Sie einen Registrierungsmechanismus, in dem sich Implementierungen selbst registrieren. Dieser Ansatz ähnelt der in der Frage diskutierten spontanen Registrierung. Es wird im Bildpaket verwendet, wo sich verschiedene Bildformat-Decoder (z. B. GIF, JPEG, PNG) registrieren.

3. Vorgeschlagene benutzerdefinierte Registrierung

Einführung eines separaten Factory-Pakets, das die NewClient()-Methoden zum Erstellen von Clients bereitstellt. Dieses Paket kann auf die Schnittstellen- und Implementierungspakete verweisen, ohne eine zirkuläre Abhängigkeit zu verursachen. Zum Beispiel:

package pi

// Client represents the client interface.
type Client interface { ... }
package pa

// UDPClient implements the Client interface.
type UDPClient struct { ... }
package pb

// TCPClient implements the Client interface.
type TCPClient struct { ... }
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")
    }
}

Das obige ist der detaillierte Inhalt vonWie registriere ich Go-Paketimplementierungen, ohne zyklische Abhängigkeiten zu erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn