Ich habe eine rekursive Funktion, die Objekte erstellt, die Dateipfade darstellen (die Schlüssel sind Pfade und die Werte sind Informationen über die Datei). Es ist rekursiv, da es nur für die Verarbeitung von Dateien gedacht ist. Wenn also ein Verzeichnis gefunden wird, wird die Funktion für das Verzeichnis rekursiv aufgerufen.
Abgesehen davon möchte ich das Äquivalent einer festgelegten Vereinigung auf zwei Karten ausführen (dh die "Haupt" -Karte, die mit den Werten aus dem rekursiven Aufruf aktualisiert wurde). Gibt es eine idiomatische Möglichkeit, dies zu tun, außer über eine Karte zu iterieren und jedem Schlüssel einen Wert zuzuweisen, der derselben Sache in der anderen Karte entspricht?
Das heißt: Da a,b
sind vom Typ map [string] *SomeObject
und a
und b
schließlich besiedelt sind, ist es eine Möglichkeit, Update a
mit allen Werten in b
?
Antworten:
In den Standardpaketen gibt es weder eine integrierte Methode noch eine Methode, um eine solche Zusammenführung durchzuführen.
Der idomatische Weg besteht darin, einfach zu iterieren:
for k, v := range b { a[k] = v }
quelle
a[k] = v
zua[k] = a[k] + v
oder so etwas wechseln .a[k] = append(a[k], v...)
Wenn Sie ein paar verschachtelte Karten haben,
left
undright
dann wird diese Funktion rekursiv die Elemente aus hinzufügenright
inleft
. Wenn der Schlüssel bereits vorhandenleft
ist, kehren wir tiefer in die Struktur zurück und versuchen, nur Schlüssel hinzuzufügenleft
(z. B. niemals zu ersetzen).type m = map[string]interface{} // Given two maps, recursively merge right into left, NEVER replacing any key that already exists in left func mergeKeys(left, right m) m { for key, rightVal := range right { if leftVal, present := left[key]; present { //then we don't want to replace it - recurse left[key] = mergeKeys(leftVal.(m), rightVal.(m)) } else { // key not in left so we can just shove it in left[key] = rightVal } } return left }
HINWEIS: Ich behandle nicht den Fall, in dem der Wert selbst nicht a ist
map[string]interface{}
. Also , wenn Sieleft["x"] = 1
undright["x"] = 2
dann wird der obige Code in Panik , wenn versucht wirdleftVal.(m)
.quelle