Pakete in Go registrieren, ohne zirkuläre Abhängigkeiten zu erstellen
Problem
Stellen Sie sich ein zentrales Paket vor, das Schnittstellen bereitstellt, von denen mehrere andere Pakete abhängen. Jedes abhängige Paket bietet mehrere Implementierungen dieser Schnittstellen. Das Ziel besteht darin, das zentrale Paket über diese Implementierungen zu informieren, um die Client-Instanziierung zu ermöglichen. Durch den Import abhängiger Pakete in das zentrale Paket entsteht jedoch eine zirkuläre Abhängigkeit.
Lösung
Die Go-Standardbibliothek bietet zwei Ansätze dafür Beheben Sie dieses Problem:
1. Ohne „zentrale“ Registry
- Definieren Sie Schnittstellen im zentralen Paket und kapseln Sie Implementierungen in separaten Paketen.
- Instanziieren Sie gewünschte Implementierungen explizit unter Angabe des Paketnamens.
- Beispiel: Das Paket crypto definiert die Hash-Schnittstelle, während konkrete Implementierungen in separaten Paketen wie crypto/md5 und zu finden sind crypto/sha256.
2. Mit einer „zentralen“ Registry
- Implementierungen registrieren sich im zentralen Paket, typischerweise über Paket-init()-Funktionen.
- Beispiel: Das Bildpaket definiert die Bildschnittstelle und das Mehrfachbildformat Implementierungen in Paketen wie image/gif und image/jpeg.
Alternative Lösung (vorgeschlagen): „Benutzerdefiniert“ Registrierung
- Erstellen Sie ein Zwischenhändlerpaket (z. B. pf), das sowohl das zentrale Paket (pi) als auch die Implementierungspakete (z. B. pa, pb) importiert.
- Definieren Sie „Fabrik“ Methoden in pf, um Clients zu instanziieren und so zirkuläre Abhängigkeiten zwischen pf und den anderen zu vermeiden Pakete.
Empfehlung
Die beste Lösung hängt von den Anforderungen ab. Option 1 wird bevorzugt, wenn die Auswahl der Implementierung im Voraus getroffen werden kann. Option 2 ermöglicht Erweiterbarkeit, erfordert jedoch eine explizite Registrierung. Option 3 bietet einen Kompromiss zwischen Komfort und Erweiterbarkeit.
Das obige ist der detaillierte Inhalt vonWie registriere ich Go-Pakete, ohne zirkuläre 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