Gibt es eine einfachere / schönere Möglichkeit, in Go ein Stück Schlüssel von einer Karte zu erhalten?
Derzeit iteriere ich über die Karte und kopiere die Schlüssel in ein Slice:
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
keys[i] = k
i++
}
Antworten:
Beispielsweise,
Um in Go effizient zu sein, ist es wichtig, die Speicherzuweisungen zu minimieren.
quelle
mymap
keine lokale Variable ist (und daher wächst / schrumpft), dies die einzig richtige Lösung ist - es stellt sicher, dass es keine Ausgänge gibt , wenn sich die Größe dermymap
Änderungen zwischen der Initialisierungkeys
und derfor
Schleife ändert. of-bounds Probleme.Dies ist eine alte Frage, aber hier sind meine zwei Cent. Die Antwort von PeterSO ist etwas prägnanter, aber etwas weniger effizient. Sie wissen bereits, wie groß es sein wird, sodass Sie nicht einmal append verwenden müssen:
In den meisten Situationen wird es wahrscheinlich keinen großen Unterschied machen, aber es ist nicht viel mehr Arbeit, und in meinen Tests (unter Verwendung einer Karte mit 1.000.000 zufälligen
int64
Schlüsseln und anschließendes zehnmaliges Generieren des Schlüsselarrays mit jeder Methode) ging es darum 20% schneller, um Mitglieder des Arrays direkt zuzuweisen, als um Anhängen zu verwenden.Durch das Festlegen der Kapazität werden zwar Neuzuweisungen vermieden, das Anhängen muss jedoch noch zusätzliche Arbeit leisten, um zu überprüfen, ob Sie bei jedem Anhängen die Kapazität erreicht haben.
quelle
for i, k := range mymap{
? Auf diese Weise brauchen Sie das i ++ nicht?i, k := range mymap
, danni
sind es Schlüssel undk
Werte, die diesen Schlüsseln in der Karte entsprechen. Das hilft Ihnen nicht wirklich dabei, ein Stück Schlüssel zu füllen.Sie können auch ein Array von Schlüsseln mit Typ
[]Value
nachMapKeys
StrukturmethodeValue
aus dem Paket "Reflect" entnehmen :quelle
[]string
?Ein besserer Weg, dies zu tun, wäre
append
:Abgesehen davon haben Sie kein Glück - Go ist keine sehr ausdrucksstarke Sprache.
quelle
keys = make([]int, 0, len(mymap))
wird die Zuweisungen loswerden, aber ich gehe davon aus, dass es immer noch langsamer sein wird.Ich habe einen skizzenhaften Benchmark für die drei in anderen Antworten beschriebenen Methoden erstellt.
Offensichtlich ist die Vorbelegung des Slice vor dem Ziehen der Tasten schneller als die
append
Eingabe, aber überraschenderweise ist diereflect.ValueOf(m).MapKeys()
Methode erheblich langsamer als die letztere:Hier ist der Code: https://play.golang.org/p/Z8O6a2jyfTH (das Ausführen auf dem Spielplatz bricht ab und behauptet, dass es zu lange dauert, also führen Sie es lokal aus.)
quelle
keysAppend
Funktion können Sie die Kapazität deskeys
Arrays einstellenmake([]uint64, 0, len(m))
, wodurch sich die Leistung dieser Funktion für mich drastisch geändert hat.Besuchen Sie https://play.golang.org/p/dx6PTtuBXQW
quelle