Вы можете (непреднамеренно) перепутать вопросы здесь.
Причина хранения указателей на карте состоит не в том, чтобы заставить работать "точечные поля", а скорее в том, чтобы сохранить точное расположениезначения «хранятся» картой.
Одним из важнейших свойств карт Go является то, что значения, связанные с их ключами, не являются адресуемыми.Другими словами, вы не можете юридически сделать что-то вроде
m := {"foo": 42}
p := &m["foo"] // this won't compile
. Причина в том, что конкретные реализации языка Go могут свободно реализовывать карты таким образом, чтобы они могли перемещаться по значениям, которые они содержат.Это необходимо, поскольку карты обычно реализуются как сбалансированные деревья, и эти деревья могут потребовать перебалансировки после удаления и / или добавления новых записей.Следовательно, если бы языковая спецификация позволила бы получить адрес значения, хранящегося на карте, это запретило бы карте перемещать свои значения вокруг.
Именно по этой причине вы не можетеВыполните модификацию значений карты «на месте», если они имеют типы struct
, и вам необходимо заменить их на «оптовые».
Если вы добавляете элемент на карту, значение равно скопированы на карту, и она также копируется (перемещается), когда карта перемешивает свои записи вокруг.
Следовательно, главная причина для хранения указателей на карте заключается в сохранении «идентичностей»значения, которые «индексируются» картой - если они существуют только в одном месте в памяти - и / или для предотвращения чрезмерных операций с памятью.Некоторые типы невозможно даже разумно скопировать без внесения ошибки - хороший пример - sync.Mutex
или тип struct
, содержащий его.
Возвращаясь к вашему вопросу, используя указатели с картой для предложенной вами целиЭто может быть хорошим взломом, но имейте в виду, что это запах кода: при выборе значений по сравнению с указателями относительно карты, вы должны быть весьма обеспокоены соображениями, изложенными выше.
¹по крайней мере два из них, которые активно поддерживаются: «фондовый», дублированный «gc», и часть GCC.