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 := productsTa 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
0xc00010e0c0Rozwią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ą.
Wyzwanie
ŁatwyW 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
1Wprowadzenie
WprowadzeniePoćwicz samodzielnie: Kompilator Go online