Tengo una función recursiva que crea objetos que representan rutas de archivo (las claves son rutas y los valores son información sobre el archivo). Es recursivo ya que solo está destinado a manejar archivos, por lo que si se encuentra un directorio, la función se llama de forma recursiva en el directorio.
Dicho todo esto, me gustaría hacer el equivalente a una unión de conjuntos en dos mapas (es decir, el mapa "principal" actualizado con los valores de la llamada recursiva). ¿Hay alguna forma idiomática de hacer esto además de iterar sobre un mapa y asignar cada clave, valor en él a lo mismo en el otro mapa?
Es decir: dado a,b
son de tipo map [string] *SomeObject
, y a
y b
son finalmente pobladas, ¿hay alguna manera de actualización a
con todos los valores de b
?
Respuestas:
No hay una forma incorporada, ni ningún método en los paquetes estándar para hacer tal fusión.
La forma idomática es simplemente iterar:
for k, v := range b { a[k] = v }
fuente
a[k] = v
aa[k] = a[k] + v
o algo por el estilo.a[k] = append(a[k], v...)
Si tiene un par de mapas anidados
left
yright
, esta función agregará recursivamente los elementos deright
enleft
. Si la clave ya estáleft
ingresada, recurrimos más profundamente a la estructura e intentamos solo agregar clavesleft
(por ejemplo, nunca reemplazarlas).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 }
NOTA: No manejo el caso en el que el valor no sea en sí mismo a
map[string]interface{}
. Así que si usted tieneleft["x"] = 1
yright["x"] = 2
entonces el código anterior en pánico cuando se intentaleftVal.(m)
.fuente