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) }
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)
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:
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) } }
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) } }
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!