Golang-Importzyklen lösen (Importzyklus nicht zulässig)

Golang Importzyklen Losen Importzyklus Nicht Zulassig



Importzyklen, allgemein bekannt als „Import Cycle Not Allowed“-Fehler, sind ein sehr häufiges Problem für neue Golang-Entwickler.

Importzyklen treten auf, wenn zwei oder mehr Pakete sich gegenseitig importieren, entweder direkt oder indirekt, wodurch eine zirkuläre Abhängigkeit entsteht.

Was sind Importzyklen?

In Go ist der Code hauptsächlich in wartbaren Einheiten namens „Pakete“ organisiert. Jedes Paket kann von anderen Paketen abhängen, sodass die App den Code teilen und die Lesbarkeit verbessern kann.







Importzyklen treten auf, wenn die Pakete eine zirkuläre Abhängigkeitskette bilden. Mit anderen Worten: Paket A importiert Paket B und Paket B importiert Paket A oder ein anderes Paket, das schließlich Paket A importiert.



Diese zirkuläre Beziehung stellt ein Problem dar, da das Build-System von Go die Reihenfolge, in der die Pakete kompiliert werden sollen, nicht bestimmen kann, was zu einem Fehler führt.



Gründe für Importzyklen

Bevor wir uns mit den technischen Details befassen, warum Importzyklen auftreten und wie man sie debuggt, wollen wir zunächst die Gründe für die mangelnde Unterstützung von Importzyklen in Go kennenlernen.





Go ist eine sehr vereinfachte, aber hocheffiziente Sprache, die sich stark auf eine schnellere Kompilierzeit statt auf die Ausführungszeit konzentriert.

Wenn Sie einen Go-Code kompilieren, zahlt der Compiler daher stark auf die Kompilierungszeit und nicht auf den effizientesten Maschinencode.



Wenn es um Importzyklen geht, können Pakete, die sich gegenseitig importieren, die Kompilierungszeit erheblich verlängern, da der Code jedes Mal kompiliert wird, wenn eine der Abhängigkeiten geändert wird.

Sie können sich Importzyklen wie eine indirekte unendliche Abhängigkeitsrekursion vorstellen, mit der der Go-Compiler nicht einverstanden ist.

Sie können auch zu Speicherverlusten führen, da jedes Objekt an das andere gebunden ist und die Referenz niemals Null erreicht. Das Aufräumen solcher Objekte wird mehr als umständlich.

Warum Importzyklen auftreten

Im Folgenden sind einige der Gründe aufgeführt, die beim Importieren der Zyklen in Ihre Codebasis auftreten können:

Schlechtes Paketdesign – Wahrscheinlich erstellen Sie als neuer Golang-Entwickler Pakete mit übermäßig komplexen Abhängigkeiten, was zu Importzyklen führen kann.

Refactoring-Probleme – Ein weiterer Grund, warum Sie die Importzyklen möglicherweise in Go erstellen, ist das Refactoring des Codes. Der Versuch, einen wiederverwendbaren Code zu erstellen, kann dazu führen, dass Sie Importzyklen erstellen.

Fehlendes Abhängigkeitsmanagement – ​​Wenn kein geeignetes Abhängigkeitsmanagement-Tool wie Go-Module verwendet wird, kann es schwierig sein, die Paketabhängigkeiten zu verfolgen und zu verwalten.

Gemeinsame Schnittstellen – Wenn mehrere Pakete von einer gemeinsamen Schnittstelle abhängen, kann es zu zirkulären Abhängigkeiten kommen.

Beispiel eines Importzyklus

Lassen Sie uns ein einfaches Beispiel erstellen, um die Importzyklen in Go zu demonstrieren.

Angenommen, wir haben ein Paket namens „PackageX“ und „PackageY“. In unserem Code hängt „PackageX“ von „PackageY“ und „PackageY“ von „PackageX“ ab.

Das Folgende ist ein Beispielcode für „PackageX“:

Paket PaketX
importieren (
„fmt“
„PaketY“
)
Funktion Eine Funktion () {
fmt . Druckenln ( „Funktion in PaketA“ )
PaketY . BFunktion ()
}

Das Folgende ist ein Beispielcode für „PackageY“:

Paket PaketY
importieren (
„fmt“
„PaketX“
)
Funktion BFunktion () {
fmt . Druckenln ( „Funktion in PaketB“ )
PaketX . Eine Funktion ()
}

In diesem Beispiel importiert „packageX“ „packageY“ und „packageY“ importiert „packageX“ und erstellt so einen Importzyklus.

Das Ausführen des vorherigen Codes sollte einen Fehler wie „Importzyklus nicht zulässig“ zurückgeben.

Paket PaketX

importiert packageY

importiert packageX

Korrigieren Sie die Importzyklen in Go

Um einen Importzyklus zu reparieren, müssen Sie lediglich den Code umstrukturieren und die zirkuläre Abhängigkeit entfernen, während die Funktionalität erhalten bleibt.

Extrahieren Sie die Schnittstellen

Wenn die Pakete aufgrund der gemeinsam genutzten Schnittstelle eine zirkuläre Abhängigkeit verursachen, können Sie die Schnittstellen in ein separates Paket verschieben. Auf diese Weise kann jedes Paket das Schnittstellenpaket importieren, ohne einen Zyklus zu verursachen.

Abhängigkeitsumkehr

Wenden Sie das Dependency Inversion Principle (DIP) an, indem Sie die abstrakten Schnittstellen im Paket der höheren Ebene definieren und sie im Paket der niedrigeren Ebene implementieren. Dies reduziert die direkten Abhängigkeiten zwischen Paketen.

Abschluss

In diesem Tutorial haben wir etwas über die Importzyklen in Go gelernt. Wir haben auch etwas über Importzyklen gelernt, das Beispiel eines Importzyklus und die Möglichkeiten, diese zu beheben.