Ich entwerfe ein Paket, bei dem ich eine API basierend auf dem Beobachtermuster bereitstellen möchte: Das heißt, es gibt Punkte, an denen ich ein Signal aussenden möchte, das null oder mehr interessierte Parteien auslöst. Diese interessierten Parteien sollten nicht unbedingt voneinander wissen müssen.Gibt es eine bevorzugte Möglichkeit, Signal- oder Ereignis-APIs in Go zu entwerfen?
Ich weiß, dass ich eine API wie diese von Grund auf neu implementieren kann (z. B. mit einer Sammlung von Kanälen oder Callback-Funktionen), aber ich frage mich, ob es eine bevorzugte Möglichkeit zur Strukturierung solcher APIs gibt.
In vielen der Sprachen oder Frameworks, mit denen ich gespielt habe, gab es standardmäßige Möglichkeiten, diese APIs so zu erstellen, dass sie sich so verhalten, wie es der Benutzer erwartet: z. Die g_signal_*
Funktionen für glib-basierte Anwendungen, Ereignisse und addEventListener()
für JavaScript-DOM-Anwendungen oder Multicast-Delegaten für .NET.
Gibt es etwas Ähnliches für Go? Wenn nicht, gibt es eine andere Möglichkeit, diese Art von API zu strukturieren, die in Go eher idiomatisch ist?
Ich denke, diese Antwort einige Anwendungsfälle abdeckt, aber ich würde auf jeden Fall mehr Meinungen/Antworten über das hören möchte. Kanäle belasten den Aufrufer (den "Beobachter") etwas mehr, da er eine Goroutine starten muss, die auf diesem Kanal wartet. Wenn dieselbe Funktion viele "Ereignisse" verarbeiten kann, kann dies mühsam werden. Als Gegenbeispiel werden Rückrufe in net/http für HTTP-Handler verwendet. Es gibt Anwendungsfälle, in denen sie IMHO mehr Sinn machen. – mna
Ich habe den Begriff "Beobachtermuster" nur verwendet, weil es ein Begriff ist, den die Leute vielleicht verstehen: Ich schreibe meine Programme nicht, indem ich sie zuerst in benannte Entwurfsmuster zerlege, wenn Sie das verstehen. Was Ihren API-Vorschlag betrifft, kann ich sehen, wie eine Funktion, die readside-Kanäle zurückgibt, für die Subskriptionsseite funktionieren könnte, aber wie würden Sie die passende unsubscribe-API modellieren? –
Kanäle sind vergleichbar für Gleichheit und sie sind erstklassige Objekte. Wenn Sie sich abmelden möchten, geben Sie den Kanal einfach an den Publisher zurück, er kann seinen Kanaleintrag finden und geeignete Maßnahmen ergreifen, um das Abonnement zu beenden. – Sonia