Umgang mit Vereinigungen von Slices in generischen Funktionen mit Schnittstelleneinschränkungen
Angenommen, Sie benötigen eine generische Funktion, die entweder auf einem Slice von ganzen Zahlen oder auf einem Slice von ganzen Zahlen operiert Stück Schwimmer. Um dies zu implementieren, können Sie generische Elemente und Schnittstelleneinschränkungen verwenden, wie unten gezeigt:
package main import "fmt" // NumberSlice defines an interface for either slice of integers or slice of floats. type NumberSlice interface { []int | []float64 } // add is a generic function that iterates over a slice of NumberSlice and prints its values. func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } } func main() { ints := []int{1, 2} add(ints) floats := []float64{3.14, 1.618} add(floats) }
Beim Versuch, den obigen Code auszuführen, kann jedoch die folgende Fehlermeldung auftreten:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Dieser Fehler tritt auf, weil die NumberSlice-Schnittstelle keinen Kerntyp hat. Ein Kerntyp für eine Schnittstelle ist ein einzelner zugrunde liegender Typ, den alle Typen in der Schnittstelle erben müssen. Da NumberSlice sowohl Slices von Ganzzahlen als auch Slices von Gleitkommazahlen akzeptieren kann, erfüllt es diese Anforderung nicht.
Um dieses Problem zu beheben, können Sie die Schnittstelle mithilfe der Basistypen anstelle von Slices definieren:
type Number interface { int | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
Diese modifizierte Funktion verwendet ein Segment von Number-Elementen als Parameter, sodass sie sowohl Ganzzahlen als auch Gleitkommazahlen effizient verarbeiten kann.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Slices-Vereinigungen in Go-Generic-Funktionen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!