Heim > Artikel > Backend-Entwicklung > Wie kann man über die Vereinigung von Slices iterieren, die in einer generischen Funktion übergeben werden? (Kernloser T-Typ)
Ich teste Generika in Go 1.18 und habe mir dieses Beispiel angesehen. Ich möchte dieses Beispiel nachbilden, aber in der Lage sein, ein Int-Slice oder ein Float-Slice zu übergeben, und in der Funktion werde ich alles im Slice summieren.
Dabei stieß ich beim Durchlaufen der Slices auf einige Probleme. Folgendes habe ich versucht:
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) }
Ich erhalte die Fehlermeldung:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Wie erreiche ich dieses Ziel?
Der Kerntyp einer Schnittstelle (einschließlich Schnittstelleneinschränkungen) ist wie folgt definiert:
Eine Schnittstelle t hat einen Kerntyp, wenn eine der folgenden Bedingungen erfüllt ist: Zufrieden:
Es gibt einen einzelnen Typu
, der der zugrunde liegende Typ aller Typen im T-Typ-Satz ist
Oder die Typenmenge von t enthält nur Kanaltypen mit demselben Elementtyp e, und alle gerichteten Kanäle haben die gleiche Richtung.
Ihre Schnittstellenbeschränkung hat keinen Kerntyp, da sie zwei zugrunde liegende Typen hat: []int64
和 []float64
.
Sie können es also nicht verwenden, wenn ein Kerntyp erforderlich ist. Besonders range
和 make
.
Sie können die Schnittstelle so ändern, dass sie den Basistyp erfordert, und dann den Slice in der Funktionssignatur angeben:
// still no core type... type number interface { int64 | float64 } // ...but the argument will be instantiated with either int64 or float64 func add[n number](n []n) { for _, v := range n { fmt.println(v) } }
Das funktioniert auch, ist aber ausführlicher:
type NumberSlice[N int64 | float64] interface { // one core type []N ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
Das obige ist der detaillierte Inhalt vonWie kann man über die Vereinigung von Slices iterieren, die in einer generischen Funktion übergeben werden? (Kernloser T-Typ). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!