Heim > Backend-Entwicklung > Golang > ## Wie initialisiere ich Schnittstellenabschnitte mit konkreten Typen in Go?

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

Susan Sarandon
Freigeben: 2024-10-25 14:01:02
Original
1042 Leute haben es durchsucht

## 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, 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>
Nach dem Login kopieren

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.

Explizites Casting verwenden

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage