Copier tous les éléments d’une carte dans un autre

Donné

var dst, src map[K]V 

Je peux copier toutes les entrées de src dans dst en faisant

 for k, v := range src { dst[k] = v } 

Y a-t-il un moyen plus idiomatique de le faire?

copy ne fonctionne que sur les tranches (et la ssortingng tant que source).

Cela me semble être une très bonne façon de le faire. Je ne pense pas que copier une carte dans une autre soit assez courant pour avoir une solution à un trait.

L’utilisation d’une simple boucle de for range est la solution la plus efficace.

Notez qu’une copy intégrée ne peut pas simplement copier la mémoire de src à l’adresse de dst car elles peuvent avoir une disposition de mémoire entièrement différente. Les cartes évoluent pour s’adapter au nombre d’éléments stockés dans ces cartes. Ainsi, par exemple, si vous avez une carte avec un million d’éléments, elle occupe beaucoup plus de mémoire qu’une nouvelle carte fraîchement créée, de sorte qu’une copy intégrée ne peut pas simplement copier de la mémoire sans en atsortingbuer de nouvelles.

Si votre carte est volumineuse, vous pouvez accélérer la copie des éléments si vous pouvez créer la carte de destination ayant une capacité suffisante pour éviter la réatsortingbution et la réallocation (la capacité initiale ne limite pas sa taille), par exemple:

 dst := make(map[K]V, len(src)) for k, v := range src { dst[k] = v } 

Si les performances ne sont pas un problème (par exemple, vous travaillez avec de petites cartes), une solution générale peut être créée à l’aide du package de reflect :

 func MapCopy(dst, src interface{}) { dv, sv := reflect.ValueOf(dst), reflect.ValueOf(src) for _, k := range sv.MapKeys() { dv.SetMapIndex(k, sv.MapIndex(k)) } } 

Cette solution ne vérifie pas si les arguments sont vraiment des cartes et si la destination n’est pas nil . Le tester:

 m1 := map[int]ssortingng{1: "one", 2: "two"} m2 := map[int]ssortingng{} MapCopy(m2, m1) fmt.Println(m2) m3 := map[ssortingng]int{"one": 1, "two": 2} m4 := map[ssortingng]int{} MapCopy(m4, m3) fmt.Println(m4) 

Sortie (essayez-le sur le terrain de jeu Go ):

 map[1:one 2:two] map[one:1 two:2] 

Vous pouvez utiliser github.com/linkosmos/mapop

 input := map[ssortingng]interface{}{ "Key1": 2, "key3": nil, "val": 2, "val2": "str", "val3": 4, } input2 := map[ssortingng]interface{}{ "a2": "str", "a3": 4, } input = mapop.Merge(input, input2) input{"Key1": 2, "key3": nil, "val": 2, "val2": "str", "val3": 4, "a2": "str", "a3": 4}