Ich mag Google Golang wirklich, aber könnte jemand erklären, warum die Implementierer eine grundlegende Datenstruktur, wie z. B. Mengen aus der Standardbibliothek, weggelassen haben?
69
Ich mag Google Golang wirklich, aber könnte jemand erklären, warum die Implementierer eine grundlegende Datenstruktur, wie z. B. Mengen aus der Standardbibliothek, weggelassen haben?
Antworten:
Ein möglicher Grund für diese Auslassung ist, dass es sehr einfach ist, Sets mit einer Karte zu modellieren.
Um ehrlich zu sein, denke ich, dass es auch ein bisschen ein Versehen ist, wenn man sich jedoch Perl ansieht, ist die Geschichte genau dieselbe. In Perl erhalten Sie Listen und Hashtabellen, in Go erhalten Sie Arrays, Slices und Maps. In Perl verwenden Sie in der Regel eine Hash-Tabelle für alle Probleme, die sich auf eine Menge beziehen. Dasselbe gilt für Go.
Beispiel
Um eine Menge von Ints in Go zu imitieren, definieren wir eine Karte:
Etwas hinzuzufügen ist so einfach wie:
Etwas zu löschen ist einfach
Und die potentielle Unbeholfenheit dieses Konstrukts wird leicht beseitigt:
Und löschen und erhalten können in ähnlicher Weise definiert werden, ich habe die vollständige Umsetzung hier . Der Hauptnachteil hierbei ist die Tatsache, dass go keine Generika hat. Es ist jedoch möglich, dies zu tun. In diesem
interface{}
Fall hätten Sie die Ergebnisse von get gewirkt.quelle
map[int]bool
kann manmap[int]struct{}
stattdessen verwenden. Ich bevorzuge den letzten.map[int]struct{}
.. Dasstruct{}
dauert 0 Bytes.map[int]struct{}
Sie nichtif mymap["key"] {
auf Mitgliedschaft prüfen. Google empfiehlt die Verwendung vonbool
(Suche nach "Ein Satz kann implementiert werden").Ich denke, das hat mit
golang
Einfachheit zu tun .set
s wurde wirklich nützlich mitdifference
,intersection
,union
,issubset
, und so weiter .. Methoden. Vielleicht hat dasgolang
Team das Gefühl, dass es für eine Datenstruktur zu viel ist. Aber ansonsten eine "dumme Menge", die nur hatadd
,contains
undremove
mit der leicht nachgebildet werden kann,map
wie von @jozefg erklärt.quelle
Die vorherige Antwort funktioniert NUR, WENN der Schlüssel ein eingebauter Typ ist. Als Ergänzung zur vorherigen Antwort können Sie hier eine Menge implementieren, deren Elemente benutzerdefinierte Typen sind:
quelle
type mySet map[IntPoint]bool
funktioniert einwandfrei. Für den in einer Karte verwendeten Schlüsseltyp ist nur erforderlich, dass er==
und enthält!=
. Die Gleichheit der Strukturtypen ist gut definiert, IhreEquals
Methode sollte gerecht seinp1 == p2
.Contains
linear undaMap[]
konstant ist, unabhängig von der Anzahl der Mitglieder. Eine bessere Lösung würde intern einen eindeutigen Schlüssel erstellen, der auf dem Inhalt jedes Mitglieds basiert, und die vommap
Typ bereitgestellte Abfrage mit konstanter Zeit nutzen . Es gibt auch noch schnellere Lösungen, die das Cache-Verhalten usw. berücksichtigen.