Heim >Backend-Entwicklung >Golang >Wie kann ich über eine Union von Slices in einer generischen Go-Funktion ohne Kerntyp iterieren?

Wie kann ich über eine Union von Slices in einer generischen Go-Funktion ohne Kerntyp iterieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-23 15:23:10623Durchsuche

How Can I Iterate Over a Union of Slices in a Go Generic Function Without a Core Type?

Iterieren über eine Union von Slices in einer generischen Funktion ohne Kerntyp

In Go 1.18 ermöglichen generische Funktionen die Arbeit mit Typen dynamisch. Allerdings sind bei der Iteration über einen Slice, der aus unterschiedlichen Typen besteht, Herausforderungen zu bewältigen, die zusätzliche Überlegungen erfordern.

Beim Umgang mit Typeinschränkungen müssen wir das Konzept eines Kerntyps verstehen. Ein Kerntyp liegt vor, wenn ein einzelner zugrunde liegender Typ für alle Typen in einer Schnittstelle vorhanden ist oder wenn alle Kanäle denselben Elementtyp und dieselbe Richtung haben.

Im ersten Codebeispiel:

type NumberSlice interface {
    []int64 | []float64
}

Die Schnittstellenbeschränkung NumberSlice hat keinen Kerntyp, da es mehrere zugrunde liegende Typen umfasst: []int64 und []float64. Das bedeutet, dass wir uns nicht über Slices dieser Schnittstelle bewegen können.

Um dieses Hindernis zu überwinden, können wir die Schnittstelle so ändern, dass stattdessen die Basistypen erforderlich sind:

type Number interface {
    int64 | float64
}

func add[N Number](n []N) {
    for _, v := range n {
        fmt.Println(v)
    }
}

Dadurch können wir Slices von deklarieren int64 oder float64 und iterieren über sie innerhalb der generischen Funktion.

Alternativ können wir eine explizitere Schnittstelle mit einem Kern definieren Typ:

type NumberSlice[N int64 | float64] interface {
    ~[]N
}

func add[S NumberSlice[N], N int64 | float64](n S) {
    for _, v := range n {
        fmt.Println(v)
    }
}

Dieser Ansatz stellt sicher, dass die Schnittstelle einen bekannten zugrunde liegenden Typ von []N für alle Typen hat, die NumberSlice[N] implementieren.

Durch diese Anpassungen können wir erfolgreich iterieren Vereinigungen von Slices innerhalb generischer Funktionen, was für mehr Flexibilität in unserem Code sorgt.

Das obige ist der detaillierte Inhalt vonWie kann ich über eine Union von Slices in einer generischen Go-Funktion ohne Kerntyp iterieren?. 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