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

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

DDD
DDDOriginal
2024-12-21 06:52:10905Durchsuche

How to Register Go Packages Without Creating Cyclic Dependencies?

Pakete in Go ohne zyklische Abhängigkeit registrieren

Problem:

Sie haben ein zentrales Paket, das Schnittstellen bereitstellt und davon abhängt andere Pakete, die Implementierungen dieser Schnittstellen anbieten. Durch die Aufnahme dieser abhängigen Pakete in das zentrale Paket entsteht jedoch eine zyklische Abhängigkeit, die Go nicht zulässt.

Standardbibliothekslösungen:

  • Ohne Zentrale Registry: Definieren Sie Schnittstellen in einem Paket und konkrete Implementierungen in separaten Paketen. Der Benutzer gibt explizit an, welche Implementierung verwendet werden soll.
  • Mit Central Registry: Implementierungen registrieren sich selbst in einer zentralen Registry (häufig über Paket-init()-Funktionen). Dies ermöglicht Erweiterbarkeit, erfordert jedoch eine manuelle Registrierung.

Benutzerdefinierte Registrierungslösung:

  • Erstellen Sie ein zusätzliches Paket (pf), das „Werks“-Methoden bereitstellt um bestimmte Implementierungen zu instanziieren.
  • Das Factory-Paket hängt sowohl vom Schnittstellenpaket (pi) als auch von den Implementierungspaketen (pa, pb usw.) ab, aber Dadurch entsteht kein Kreislauf, da PF nicht von sich selbst abhängt.

Auswahl der besten Lösung:

Der ideale Ansatz hängt von den spezifischen Anforderungen ab:

  • Wenn Sie die zu verwendende Implementierung vorab festlegen können, entscheiden Sie sich für die erste Lösung (ohne Zentrale). Registrierung).
  • Wenn die Erweiterbarkeit entscheidend ist und Sie die Implementierung nicht vorhersagen können, ziehen Sie die zweite oder dritte Lösung in Betracht (mit einer zentralen oder benutzerdefinierten Registrierung).

Codebeispiel für Benutzerdefinierte Registrierungslösung:

// Package pi defines an interface I.
package pi

type I interface {
    // Some method.
    DoSomething()
}

// Package pa implements I with type A.
package pa

import "pi"

type A struct{}

func (a *A) DoSomething() {
    // Some implementation.
}

// Package pb implements I with type B.
package pb

import "pi"

type B struct{}

func (b *B) DoSomething() {
    // Some implementation.
}

// Package pf provides a factory to create instances of I.
package pf

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

// NewClient returns an instance of I based on a flag.
func NewClient(flag string) pi.I {
    switch flag {
    case "a":
        return &pa.A{}
    case "b":
        return &pb.B{}
    default:
        panic("Invalid flag")
    }
}

Das obige ist der detaillierte Inhalt vonWie registriere ich Go-Pakete, 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