„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > ## Wie initialisiere ich Schnittstellenabschnitte mit konkreten Typen in Go?

## Wie initialisiere ich Schnittstellenabschnitte mit konkreten Typen in Go?

Veröffentlicht am 10.11.2024
Durchsuche:156

## How to Initialize Slices of Interfaces with Concrete Types in Go?

Generische Initialisierung mit Schnittstellen und konkreten Typen in Go

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.

Erste Versuche mit mehreren Typparametern

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, eine Instanz von Y einem Element vom Typ X zuzuweisen.

func Fill[X, Y any](slice []X){
   for i := range slice {
      slice[i] = new(Y) // not work!
   }
}

Dieses Problem tritt auf, weil der Compiler die Beziehung zwischen der Schnittstelle X und ihrer Implementierung Y verliert. Sowohl ]Um dies zu beheben, kann man eine explizite Umwandlungsoperation innerhalb der Funktion verwenden:

func Fill[X, Y any](slice []X) { für i := Bereich Slice { Slice[i] = any(*new(Y)).(X) } }

Dieser Ansatz löst jedoch eine Panik aus, wenn Y X nicht implementiert, was in Szenarien wie dem Versuch auftritt, sync.Locker einen *sync.Mutex (Zeigertyp) zuzuweisen.
func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}

Eine robustere und typsicherere Lösung beinhaltet die Verwendung einer Konstruktorfunktion:

func Fill[X any](slice []X, f func() X ) { für i := Bereich Slice { Slice[i] = f() } }

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.
func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}

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{} }.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3