maps.Clone în Go

Clone face o copie a unui map; Copy copiază toate perechile din src în dst, suprascriind cheile existente.

Sintaxă
import "maps"

func Clone[M ~map[K]V, K comparable, V any](m M) M
func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2)

Ce face maps.Clone

Un map în Go este o referință: b := a nu copiază datele, ci face ca ambele variabile să vadă același map. maps.Clone(m) creează un map nou, cu aceleași perechi, pe care îl poți modifica fără să atingi originalul. Clone(nil) returnează nil.

maps.Copy(dst, src) pune toate perechile din src în dst. Dacă o cheie există deja în dst, valoarea ei este înlocuită. Este util pentru a aplica setări noi peste setări implicite.

Ambele copii sunt superficiale: dacă valorile sunt slice-uri, pointeri sau alte map-uri, originalul și copia vor împărți acele date.

Parametri

Parametru Descriere
m Pentru Clone: map-ul copiat.
dst, src Pentru Copy: destinația (trebuie să nu fie nil) și sursa.

Ce returnează

Clone: map-ul nou. Copy: nimic.

Exemple

Exemplul 1: Atribuire față de clonare

package main

import (
    "fmt"
    "maps"
)

func main() {
    note := map[string]int{"Ana": 9, "Mihai": 7}
    acelasi := note
    copie := maps.Clone(note)

    acelasi["Ana"] = 10
    copie["Mihai"] = 5
    fmt.Println(note)
    fmt.Println(copie)
}

Rezultat

map[Ana:10 Mihai:7]
map[Ana:9 Mihai:5]

Exemplul 2: Setări implicite peste care se aplică setările utilizatorului

package main

import (
    "fmt"
    "maps"
)

func main() {
    implicit := map[string]string{"limba": "ro", "tema": "luminoasă", "oras": "București"}
    utilizator := map[string]string{"tema": "întunecată", "oras": "Iași"}

    setari := maps.Clone(implicit)
    maps.Copy(setari, utilizator)
    fmt.Println(setari)
    fmt.Println(implicit)
}

Rezultat

map[limba:ro oras:Iași tema:întunecată]
map[limba:ro oras:București tema:luminoasă]

Greșeli frecvente

  • Crezi că b := a copiază un map: orice modificare prin b se vede în a.
  • Inversezi argumentele lui Copy: ordinea este Copy(destinație, sursă), ca la funcția predefinită copy.

Comenzi înrudite

  • slices.Clone: Returnează o copie a unui slice, cu memorie proprie: modificările copiei nu afectează originalul.
  • maps.Collect: Collect construiește un map nou din perechile unui iterator; Insert adaugă perechile într-un map existent.
  • maps.Equal: Verifică dacă două map-uri au exact aceleași chei cu aceleași valori; EqualFunc compară valorile cu o funcție proprie.