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