Heim >Backend-Entwicklung >Golang >Generische Funktionen, die Kanäle und Slices akzeptieren
Ich versuche, eine generische Funktion in Golang zu schreiben, die auf ähnliche Weise nach Werten in Slices und Kanälen sucht. Hier ist ein Beispiel:
// minof returns the smallest number found among the channel / slice contents func minof[t chan int | []int](input t) (result int) { for _, value := range input { if result > value { result = value } } return }
Aber ich erhalte den folgenden Kompilierungsfehler: cannot range over input(类型 t 的变量受 chan int|[]int 约束)(t 没有核心类型)
.
Ich habe versucht, eine generische Schnittstelle wie diese zu erstellen:
type Rangable interface { chan int | []int } // MinOf returns the smallest number found among the channel / slice contents func MinOf[T Rangable](input T) (result int) { for _, value := range input { if result > value { result = value } } return }
Obwohl der Fehler in cannot range over input(t 类型的变量受 rangable 约束)(t 没有核心类型)
geändert wurde, bleibt er im Grunde derselbe...
Gibt es eine Möglichkeit, diese Aufgabe mithilfe von Generika oder Kanälen zu lösen, ohne dass das Slice in denselben Kerntyp „konvertiert“ werden kann?
Vielen Dank für alle Vorschläge und Ideen!
Das geht nicht.
range
Der Ausdruck muss mit einem Kerntyp beginnen. Unionen mit Begriffen unterschiedlichen Typs haben keinen Kerntyp, da es keinen gemeinsamen zugrunde liegenden Typ gibt.
Sie können auch intuitiv erkennen, warum range
einen Kerntyp erfordert: Die Semantik von Slices und Kanalbereichen ist unterschiedlich.
Ranging auf einem Kanal kann ein blockierender Vorgang sein, Ranging auf einem Slice jedoch nicht
Iterationsvariablen sind unterschiedlich
for i, item := range someslice {}
Bei Slices ist i
是 int
类型的索引,item
der Typ des Slice-Elements.
for item := range somechan {}
Für Kanäle ist item
der Typ des Chan-Elements und dies ist die einzig mögliche Bereichsvariable.
Das Beste, was Sie haben können, ist ein Typwechsel:
func MinOf[T any, U chan T | []T](input U) (result int) { switch t := any(input).(type) { case chan T: // range over chan case []T: // range over slice } return }
Aber auch hier hängt das Verhalten dieser Funktion (blockierend vs. nicht blockierend) vom Typ ab und es ist nicht klar, welchen Vorteil Sie durch die Verwendung von Generika hier erzielen können.
Das obige ist der detaillierte Inhalt vonGenerische Funktionen, die Kanäle und Slices akzeptieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!