Вот некоторые части из статьи Если карта не является ссылочной переменной, что это такое? Дэйв Чейни:
Значение карты - это указатель на runtime.hmap
структуру.
и вывод:
Вывод
Карты, как и каналы, но в отличие от срезов, являются просто указателями на типы среды выполнения. Как вы видели выше, карта - это просто указатель на runtime.hmap
структуру.
Карты имеют ту же семантику указателя, что и любое другое значение указателя в программе Go. Нет никакого волшебства, кроме переписывания компилятором синтаксиса карты в вызовы функций в runtime/hmap.go
.
И кое-что интересное об истории / объяснении map
синтаксиса:
Если карты являются указателями, не так ли *map[key]value
?
Хороший вопрос: если карты являются значениями указателей, почему выражение make(map[int]int)
возвращает значение с типом
map[int]int
. Разве он не должен возвращать *map[int]int
? Ян Тейлор
недавно ответил на этот вопрос в треде 1 .
В самом начале то, что мы сейчас называем картами, писали как указатели, так что вы писали *map[int]int
. Мы отошли от этого, когда поняли, что никто никогда не писал map
без письма *map
.
Возможно, переименование типа из *map[int]int
в map[int]int
, хотя и сбивало с толку, поскольку тип не выглядело как указатель, было менее запутанным, чем значение в форме указателя, которое нельзя разыменовать.