Oto kilka części z Jeśli mapa nie jest zmienną odniesienia, co to jest? przez Dave Cheney:
Wartość mapy jest wskaźnikiem do runtime.hmap
struktury.
i wniosek:
Wniosek
Mapy, podobnie jak kanały, ale w przeciwieństwie do wycinków, są tylko wskaźnikami do typów środowiska wykonawczego. Jak widzieliście powyżej, mapa jest tylko wskaźnikiem do runtime.hmap
struktury.
Mapy mają taką samą semantykę wskaźnika, jak każda inna wartość wskaźnika w programie Go. Nie ma magii, poza przepisywaniem składni mapy przez kompilator na wywołania funkcji w programie runtime/hmap.go
.
I ciekawostka o historii / wyjaśnieniu map
składni:
Jeśli mapy są wskaźnikami, czyż nie *map[key]value
?
To dobre pytanie, jeśli mapy są wartościami wskaźnika, dlaczego wyrażenie make(map[int]int)
zwraca wartość z typem
map[int]int
. Czy nie powinien zwrócić *map[int]int
? Ian Taylor
odpowiedział niedawno w golang orzechów wątku 1 .
Na samym początku to, co teraz nazywamy mapami, było pisane jako wskaźniki, więc napisałeś *map[int]int
. Odeszliśmy od tego, gdy zdaliśmy sobie sprawę, że nikt nigdy nie pisał map
bez pisania *map
.
Prawdopodobnie zmiana nazwy typu z *map[int]int
na map[int]int
, choć myląca, ponieważ typ nie wygląda jak wskaźnik, była mniej myląca niż wartość w kształcie wskaźnika, której nie można wyłuskać.