Heim >Backend-Entwicklung >Golang >Kann das Reflection-Paket von Go generische Elementpräsenzprüfungen in Slices ermöglichen?

Kann das Reflection-Paket von Go generische Elementpräsenzprüfungen in Slices ermöglichen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-03 09:53:29817Durchsuche

Can Go's Reflection Package Enable Generic Element Presence Checks in Slices?

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:

  • Generisch: N=100000, 73,023214 ms, 730,23214 ns/op
  • Nicht generisch: N=100000, 1,315262 ms, 13,15262 ns/op

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn