Beim Schreiben generischer Funktionen in Go kann es von Vorteil sein, auch konkrete Typen zu akzeptieren. Dies stellt jedoch eine Herausforderung dar, wenn versucht wird, Schnittstellenabschnitte mit neuen Instanzen dieser spezifischen Typen zu initialisieren.
Ein Ansatz mag logisch erscheinen: Definieren von zwei Typparametern, eine für den Slice-Elementtyp (X) und eine für den konkreten Typ (Y), der instanziiert werden soll. Dieser Ansatz schlägt jedoch fehl, wenn versucht wird, einem Element vom Typ X eine Instanz von Y zuzuweisen.
<code class="go">func Fill[X, Y any](slice []X){ for i := range slice { slice[i] = new(Y) // not work! } }</code>
Dieses Problem tritt auf, weil der Compiler die Beziehung zwischen der Schnittstelle X und ihrer Implementierung Y verliert. Sowohl X als auch Y werden als verschiedene beliebige Typen behandelt.
Um dieses Problem zu beheben, kann man innerhalb der Funktion einen expliziten Casting-Vorgang verwenden:
<code class="go">func Fill[X, Y any](slice []X) { for i := range slice { slice[i] = any(*new(Y)).(X) } }</code>
Dies jedoch Der Ansatz löst eine Panik aus, wenn Y Eine robustere und typsicherere Lösung beinhaltet die Verwendung einer Konstruktorfunktion:
Diese Funktion akzeptiert eine Konstruktorfunktion, die eine neue Instanz des angegebenen Typs zurückgibt. Dies ermöglicht eine präzise und sichere Initialisierung von Slices mit konkreten Typinstanzen.Nullwerte vermeiden<code class="go">func Fill[X any](slice []X, f func() X) { for i := range slice { slice[i] = f() } }</code>
In Fällen, in denen der konkrete Typ mit einem Zeigertyp instanziiert werden soll, ist dies wichtig zu beachten dass new(Y) zu einem Nullwert führt. Um dies zu umgehen, kann man die Konstruktorfunktion so anpassen, dass sie den richtigen Zeigerwert zurückgibt, wie zum Beispiel func() X { return &sync.Mutex{} }.
Das obige ist der detaillierte Inhalt von## Wie initialisiere ich Schnittstellenabschnitte mit konkreten Typen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!