Heim > Backend-Entwicklung > Golang > Wie iteriere ich über eine Vereinigung von Slices in Go Generic-Funktionen?

Wie iteriere ich über eine Vereinigung von Slices in Go Generic-Funktionen?

Linda Hamilton
Freigeben: 2025-01-05 05:31:08
Original
215 Leute haben es durchsucht

How to Iterate Over a Union of Slices in Go Generic Functions?

Iterieren über eine Union von Slices in generischen Funktionen

Generika in Go ermöglichen die Ausführung von Funktionen mit einer Reihe von Typen und ermöglichen so die Wiederverwendung von Code Typensicherheit. Wenn Sie jedoch mit Slices unterschiedlicher Elementtypen arbeiten, kann es zu Herausforderungen kommen, wenn Sie diese innerhalb allgemeiner Funktionen durchlaufen.

Betrachten Sie das folgende Beispiel, das darauf abzielt, Elemente eines Slices zusammenzufassen, die möglicherweise entweder Ganzzahlen oder Gleitkommazahlen enthalten:

package main

import "fmt"

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

func add[N NumberSlice](n N) {
    // want: to range over n and print value of v
    for _, v := range n {
        fmt.Println(v)
    }
}

func main() {
    ints := []int64{1, 2}
    add(ints)
}
Nach dem Login kopieren

Beim Ausführen dieses Codes tritt der folgende Fehler auf:

cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Nach dem Login kopieren

Das Problem liegt im Fehlen eines „Kerntyps“ für die NumberSlice-Schnittstellenbeschränkung. Ein Kerntyp stellt einen einzelnen zugrunde liegenden Typ dar, der von allen Typen im Typsatz der Schnittstelle gemeinsam genutzt wird. Da NumberSlice sowohl []int64 als auch []float64 umfasst, hat es keinen Kerntyp.

Um dieses Problem zu lösen, gibt es einige Ansätze:

  1. Erzwingen Sie einen gemeinsamen Basistyp:
    Ändern Sie die Schnittstellenbeschränkung, um die Basistypen anzugeben und den Slice-Typ innerhalb der Funktion festzulegen Signatur:

    type Number interface {
        int64 | float64
    }
    
    func add[N Number](n []N) {
        for _, v := range n {
            fmt.Println(v)
        }
    }
    Nach dem Login kopieren
  2. Generika mit expliziter Typisierung verwenden:
    Deklarieren Sie einen generischen Slice-Typ, der den Elementtyp angibt, und verwenden Sie explizite Typisierung, um das Gewünschte anzugeben Elementtyp:

    type NumberSlice[N int64 | float64] interface {
        ~[]N // indicates a core type of []N
    }
    
    func add[S NumberSlice[N], N int64 | float64](n S) {
        for _, v := range n {
            fmt.Println(v)
        }
    }
    Nach dem Login kopieren

Durch Angabe eines Kerntyps kann der Compiler Leiten Sie das entsprechende Iterationsverhalten ab und ermöglichen Sie so den gewünschten Vorgang der Iteration über den Slice innerhalb der generischen Funktion.

Das obige ist der detaillierte Inhalt vonWie iteriere ich über eine Vereinigung von Slices in Go Generic-Funktionen?. 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