Kann generischer Code implementiert werden, um das Vorhandensein von Elementen in Go-Slices zu bestimmen?
In Go ist die Bestimmung, ob ein Slice ein bestimmtes Element enthält, ein gemeinsamer Betrieb. Allerdings kann die Implementierung dieser Logik für jeden neuen Slice-Typ mühsam erscheinen.
Ein Lösungsversuch beinhaltet die Verwendung eines Interface{}-Slices, wie im Code-Snippet zu sehen ist:
<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool { for _, item := range slice { if item == elem { return true } } return false }</code>
Allerdings Dieser Ansatz wird durch die Art der Schnittstelle{} und die Anforderung, sie für jeden neuen Slice-Typ zu implementieren, behindert.
Glücklicherweise bietet das Reflexionspaket von Go eine generische Lösung:
<code class="go">func Contains(slice, elem interface{}) bool { sv := reflect.ValueOf(slice) // Check slice type. if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array { return false } // Iterate slice and compare elements. for i := 0; i < sv.Len(); i++ { if elem == sv.Index(i).Interface() { return true } } // Element not found. return false }</code>
Diese Funktion benötigt zwei Parameter: das Slice und das zu suchende Element. Es verwendet Reflektion, um zu bestimmen, ob es sich bei dem Slice um ein Slice oder ein Array handelt, und iteriert dann über seine Elemente mit den Methoden ValueOf() und Index().
Dieser generische Ansatz ist zwar praktisch, geht aber mit Kosten einher Leistung. Benchmarks zeigen, dass es 50–60 Mal langsamer sein kann als nicht generische Versionen, wie unten zu sehen:
<code class="go">func ContainsNonGeneic(slice []int, elem int) bool { for _, i := range slice { if i == elem { return true } } return false }</code>
Benchmark-Ergebnisse:
Daher gilt die generische Funktion „Contains()“. Bietet Vielseitigkeit und sollte mit Bedacht eingesetzt werden, um Leistungsengpässe zu vermeiden.
Das obige ist der detaillierte Inhalt vonKann das Reflection-Paket von Go generische Elementpräsenzprüfungen in Slices ermöglichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!