Wenn ich eine Karte m habe, gibt es eine bessere Möglichkeit, einen Schnitt der Werte v zu erhalten
package main
import (
"fmt"
)
func main() {
m := make(map[int]string)
m[1] = "a"
m[2] = "b"
m[3] = "c"
m[4] = "d"
// Can this be done better?
v := make([]string, len(m), len(m))
idx := 0
for _, value := range m {
v[idx] = value
idx++
}
fmt.Println(v)
}
Gibt es eine integrierte Funktion einer Karte? Gibt es eine Funktion in einem Go-Paket oder ist dies der beste Code, wenn ich muss?
_
mitidx
und verwenden ,idx-1
wenn die Schichtwerte zuweisen.Antworten:
Unglücklicherweise nicht. Es gibt keine eingebaute Möglichkeit, dies zu tun.
Als Randnotiz können Sie das Kapazitätsargument bei Ihrer Slice-Erstellung weglassen:
Die Kapazität entspricht hier der Länge.
quelle
Als Ergänzung zu Jimts Beitrag:
Sie können
append
die Werte auch verwenden, anstatt sie explizit ihren Indizes zuzuweisen:Beachten Sie, dass die Länge Null ist (noch keine Elemente vorhanden), die Kapazität (zugewiesener Speicherplatz) jedoch mit der Anzahl der Elemente von initialisiert wird
m
. Dies geschieht, sodassappend
nicht jedes Mal Speicher zugewiesen werden muss, wenn die Kapazität des Slicev
erschöpft ist.Sie können
make
das Slice auch ohne den Kapazitätswert verwenden undappend
den Speicher für sich selbst zuweisen lassen .quelle
make([]appsv1.Deployment, len(d))
Wenn Sie das Array nach der Verwendung anhängen, wird es an eine Reihe leerer Elemente angehängt, die beim Zuweisen leerer Elemente erstelltlen(d)
wurden.Soweit mir derzeit bekannt ist, gibt es bei go keine Methode zum Verketten von Zeichenfolgen / Bytes zu einer resultierenden Zeichenfolge, ohne mindestens / zwei / Kopien zu erstellen.
Sie müssen derzeit ein [] Byte vergrößern, da alle Zeichenfolgenwerte const sind. DANN müssen Sie die integrierte Zeichenfolge verwenden, damit die Sprache ein 'gesegnetes' Zeichenfolgenobjekt erstellt, für das der Puffer kopiert wird, da irgendwo irgendwo eine Referenz vorhanden sein könnte an die Adresse, die das Byte [] unterstützt.
Wenn ein [] Byte geeignet ist, können Sie einen sehr geringen Vorsprung gegenüber den Bytes erzielen. Verbinden Sie die Funktion, indem Sie eine Zuordnung vornehmen und die Kopie selbst aufrufen.
quelle
Sie können dieses
maps
Paket verwenden:Dann müssen Sie nur noch anrufen
Es ist typsicher für diese übliche
map
Kombination. Sie könnengenerate
andere typsichere Funktionen für jede andere Art dermap
Verwendung von verwendenmapper
Tools im selben Paket verwenden.Vollständige Offenlegung: Ich bin der Schöpfer dieses Pakets. Ich habe es erstellt, weil ich diese Funktionen
map
wiederholt neu geschrieben habe.quelle
Nicht unbedingt besser, aber der sauberere Weg , dies zu tun ist , indem sowohl die trotzt Scheibe LäNGE und Kapazität wie
txs := make([]Tx, 0, len(txMap))
Vollständiges Beispiel:
Einfache Lösung, aber viele Fallstricke. Lesen Sie diesen Blog-Beitrag für weitere Details: https://web3.coach/golang-how-to-convert-map-to-slice-three-gotchas
quelle