Menu
Coddy logo textTech

Kopiowanie mapy

Lekcja 18 z 21 w kursie Slice’y i mapy w Go w Coddy.

Podobnie jak w przypadku wycinków, możemy skopiować mapę i dodać do niej nowe wartości.

Rozważmy taką mapę:

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

Załóżmy, że musimy skopiować mapę products:

list := products

Ta operacja utworzy kopię mapy products w list. Pojawia się jednak problem: zmiany wprowadzone w jednej mapie będą wpływać na drugą, ponieważ współdzielą tę samą przestrzeń pamięci. Możemy to sprawdzić, wyświetlając ich adresy pamięci:

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

Wynik jest następujący:

0xc00010e0c0 
0xc00010e0c0

Rozwiązaniem jest użycie słowa kluczowego make. Najpierw deklarujemy mapę za pomocą słowa kluczowego make:

list := make(map[string]int)

Możesz teraz zapytać, czym różni się użycie make od zwykłej deklaracji, takiej jak ta:

list := map[string]int{}

Właściwie nie ma różnicy, z wyjątkiem tego, że używając make, możemy określić długość mapy.

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

W tym przypadku określamy długość równą długości mapy, którą chcemy skopiować.

Uwaga: długość mapy nie działa tak jak w przypadku wycinka. Nawet jeśli określimy długość, możemy ją bez problemu przekroczyć.

Po zdefiniowaniu nowej mapy możemy skopiować elementy z products do mapy list za pomocą pętli:

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

Wynik będzie następujący:

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

Teraz zmiana jednej mapy nie wpłynie na drugą.
 

challenge icon

Wyzwanie

Łatwy

W podanym kodzie definiujemy mapę produktów o nazwie productByName:

  • Utwórz nową mapę o nazwie productByPrice.
  • Skopiuj elementy z mapy productByName, ale w odwrotny sposób: cena będzie kluczem, a nazwa będzie wartością.
  • Wyświetl obie mapy na ekranie.

Spróbuj swoich sił

package main

import "fmt"

func main() {
    // Zdefiniuj mapę produktów według nazwy. Nie zmieniaj tego!
    productByName := map[string]int{
        "MacBook":    5000,
        "iPhone":     1000,
        "Vision Pro": 3000,
    }

    // Utwórz nową mapę produktów według ceny
    

    // Skopiuj elementy z productByName do productByPrice
     

    // Wyświetl obie mapy na ekranie
    fmt.Println("By Name:", )
    fmt.Println("By Price:", )
}

Wszystkie lekcje w sekcji Slice’y i mapy w Go

Poćwicz samodzielnie: Kompilator Go online