Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie Set in Golang

So implementieren Sie Set in Golang

PHPz
PHPzOriginal
2023-04-14 09:16:371035Durchsuche

Golang ist eine statisch typisierte, objektorientierte Programmiersprache mit hoher Parallelität und eine der Sprachen, die in den letzten Jahren immer beliebter geworden sind. Obwohl es in Golang keinen Set-Typ gibt, können wir die Set-Funktion problemlos über grundlegende Datenstrukturen wie Slice und Map implementieren. In diesem Artikel wird erläutert, wie Sie Set mit Golang implementieren.

Definition von Set

Set ist eine ungeordnete und sich nicht wiederholende Datenstruktur. Sie unterstützt grundlegende Operationen eines Sets, einschließlich des Hinzufügens von Elementen, des Löschens von Elementen, des Bestimmens, ob Elemente vorhanden sind usw. In einer Menge gibt es keine sequentielle Beziehung zwischen den Elementen und jedes Element ist einzigartig.

Slice implementiert Set

Slice in Golang kann die Funktion von Set implementieren, da die Elemente in Slice geordnet sind und jedes Element wiederholt erscheinen kann. Wir können den Deduplizierungsvorgang von Slice über benutzerdefinierte Methoden implementieren, um den Zweck von Set zu erreichen.

type SetSlice []interface{}

func (s *SetSlice) Add(val interface{}) {
    for _, v := range *s {
        if val == v {
            return
        }
    }
    *s = append(*s, val)
}

func (s *SetSlice) Remove(val interface{}) {
    for i, v := range *s {
        if val == v {
            *s = append((*s)[:i], (*s)[i+1:]...)
            return
        }
    }
}

func (s *SetSlice) Contains(val interface{}) bool {
    for _, v := range *s {
        if val == v {
            return true
        }
    }
    return false
}

Im obigen Code haben wir den SetSlice-Typ angepasst und die Methoden „Add“, „Remove“, „Contains“ und andere hinzugefügt. Wenn wir die Add-Methode aufrufen, prüfen wir zunächst, ob das gleiche Element vorhanden ist, indem wir das Slice durchlaufen, und kehren direkt zurück, wenn es existiert gelöscht und führt den Löschvorgang durch. Wenn wir feststellen, ob ein Element vorhanden ist, durchlaufen wir auch das Slice, um das Element zu finden.

Map implementiert Set

Zusätzlich zu Slice kann Map in Golang auch die Set-Funktion implementieren, da jeder Schlüssel in der Map eindeutig sein muss. Wir können den Schlüssel der Karte als Wert des Elements verwenden und den Wert der Karte auf einen beliebigen Wert festlegen. Der spezifische Wert ist uns egal, wir müssen nur bestimmen, ob das Element in der Karte erscheint.

type SetMap map[interface{}]struct{}

var exist = struct{}{}

func (s SetMap) Add(val interface{}) {
    s[val] = exist
}

func (s SetMap) Remove(val interface{}) {
    delete(s, val)
}

func (s SetMap) Contains(val interface{}) bool {
    _, c := s[val]
    return c
}

Im obigen Code haben wir den SetMap-Typ angepasst und die Methoden „Hinzufügen“, „Entfernen“, „Enthält“ und andere hinzugefügt. Beim Aufrufen der Add-Methode fügen wir das Element direkt als Schlüssel der Map in die Map ein, und der Wert ist ein leerer Typ struct{}. Beim Löschen des Elements löschen wir den entsprechenden Schlüssel direkt in der Map über die Löschfunktion ; Bei der Beurteilung, ob das Element vorhanden ist, ermitteln wir, ob das Element vorhanden ist, indem wir auf den entsprechenden Schlüssel in der Karte zugreifen.

Zusammenfassung

Obwohl es in Golang keinen Set-Typ gibt, können wir die Set-Funktion über grundlegende Datenstrukturen wie Slice und Map implementieren. Die Verwendung von Slice zum Implementieren von Set erfordert eine manuelle Deduplizierung, was problematischer ist. Die Verwendung von Map zum Implementieren von Set ist einfacher und effizienter. Wenn wir komplexere Operationen für Set ausführen müssen, z. B. Schnittmenge und Vereinigung, wird natürlich empfohlen, eine Bibliothek eines Drittanbieters wie github.com/deckarep/golang-set zu verwenden, was die Effizienz erheblich verbessern kann.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Set in Golang. 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