Menu
Coddy logo textTech

Copiare una mappa

Lezione 18 di 21 del corso Slice e mappe in GoLang di Coddy.

In modo simile a quanto abbiamo fatto con le slice, possiamo copiare una mappa e aggiungervi nuovi valori.

Consideriamo una mappa come questa:

products := map[string]int{
   "MacBook": 5000,
   "iPhone": 1000,
   "Vision pro": 3000,
}

Supponiamo di dover copiare la mappa products:

list := products

Questa operazione copierà la mappa products in list. Tuttavia, il problema è che le modifiche apportate a una mappa influenzeranno anche l'altra, poiché condividono lo stesso spazio di memoria. Possiamo verificarlo stampando i loro indirizzi di memoria:

fmt.Printf("%p \n", list)
fmt.Printf("%p", products)

L'output è il seguente:

0xc00010e0c0 
0xc00010e0c0

La soluzione è usare la parola chiave make. Per prima cosa dichiariamo una mappa usando la parola chiave make:

list := make(map[string]int)

Ora potresti chiederti: qual è la differenza tra usare make o una semplice dichiarazione come questa?

list := map[string]int{}

In realtà non c'è differenza, tranne per il fatto che usando make possiamo definire una lunghezza per la mappa.

list := make(map[string]int, len(products))

Qui impostiamo la lunghezza in modo che corrisponda a quella della mappa che vogliamo copiare.

Nota: la lunghezza di una mappa non è come quella di una slice. Anche se definiamo una lunghezza, possiamo superarla senza problemi.

Ora, dopo aver definito la nostra nuova mappa, possiamo copiare gli elementi da products alla mappa list usando un ciclo:

list := make(map[string]int, len(products))
for key, value := range products {
   list[key] = value
}

Il risultato sarà:

map[Golang Book:400 Python Book:300 Rust Book:500]

Ora, se modifichiamo una mappa, non influenzerà l'altra.
 

challenge icon

Sfida

Facile

Nel codice fornito, definiamo una mappa di prodotti chiamata productByName:

  • Crea una nuova mappa chiamata productByPrice.
  • Copia gli elementi dalla mappa productByName, ma in modo inverso: il prezzo sarà la chiave e il nome sarà il valore.
  • Stampa entrambe le mappe sullo schermo.

Provalo tu

package main

import "fmt"

func main() {
    // Definisci una mappa dei prodotti per nome. Non modificarla!
    productByName := map[string]int{
        "MacBook":    5000,
        "iPhone":     1000,
        "Vision Pro": 3000,
    }

    // Crea una nuova mappa dei prodotti per prezzo
    

    // Copia gli elementi da productByName a productByPrice
     

    // Stampa entrambe le mappe sullo schermo
    fmt.Println("By Name:", )
    fmt.Println("By Price:", )
}

Tutte le lezioni di Slice e mappe in GoLang

Esercitati da solo: Compilatore Go online