Das ist eine alte Frage, aber hier sind meine zwei Cent. PeterSOs Antwort ist etwas prägnanter, aber etwas weniger effizient. Sie wissen bereits, wie groß es sein wird, so dass Sie nicht einmal brauchen append zu verwenden:
keys := make([]int, len(mymap))
i := 0
for k := range mymap {
keys[i] = k
i++
}
In den meisten Fällen wird es wahrscheinlich nicht viel Unterschied machen, aber es ist nicht viel mehr Arbeit, und in Meine Tests (mit einer Karte mit 1.000.000 zufälligen Schlüsseln int64
und dann das Array der Schlüssel zehn Mal mit jeder Methode zu generieren), war es etwa 20% schneller, Mitglieder des Arrays direkt zuzuweisen als append zu verwenden.
Obwohl das Festlegen der Kapazität Neuzuweisungen eliminiert, muss Append noch zusätzliche Arbeit zu tun, um zu überprüfen, ob Sie die Kapazität bei jedem Anhängen erreicht haben.
Es ist ein bisschen besser, die tatsächliche Größe anstelle der Kapazität einzustellen und Anhängen insgesamt zu vermeiden. Siehe meine Antwort für Details. –
Beachten Sie, dass, wenn 'mymap' keine lokale Variable ist (und daher wächst/schrumpft), dies die einzig richtige Lösung ist - es stellt sicher, dass, wenn die Größe von 'mymap' sich zwischen der Initialisierung von 'keys' und "for" -Schleife, es wird keine Out-of-Bounds-Probleme geben. – Melllvar
Karten sind unter gleichzeitigem Zugriff nicht sicher, keine der beiden Lösungen ist akzeptabel, wenn eine andere Goroutine die Karte ändern könnte. –