Мой взгляд на это, что это решение было чисто прагматическое: Go это язык очень вниз к Земле (в отличии от других — «более пуристом» — языков), и одна интересного свойства некоторого отображения реального мира что простой доступ к ним для чтения может обновить их внутреннее представление (!). Скажем, они могут собирать и хранить некоторую статистику об их использовании, или они могут перебалансировать базовое дерево, содержащее ведра ценности и т. Д. Разрешение «const-карты» будет означать явное указание набора сложных ограничений на него в спецификации языка —, что, возможно, потребует реализации двух реализаций карты.
Вы также можете попробовать взглянуть на него под другим углом: рассмотреть константу строки. Такая вещь может быть легко встроена в секциюрезультирующего двоичного кода и быть фактически представлена адресом этих данных в памяти (ну, строки в Go сложнее, но не будем игнорировать эту деталь). То есть, постоянная строка может быть действительно «статической»: это просто серия статических байтов R/O в памяти — так же просто. И наоборот, карта представляет собой сложный зверь, оснащенный сложным механизмом, и каждая карта представляет собой специальный сложный объект , созданный в режиме исполнения. Вот почему вы даже не можете просто объявить карту и использовать ее: вы должны make()
это первый — как каналы, и по той же причине.
Опять же, некоторые хаки могут быть сделаны для поддержки постоянных карт. Скажем, реализация могла бы сортировать ключи вашей карты вверх, сериализовать ее (со значениями) в смежную область данных R/O, а затем использовать бинарный поиск во время выполнения, чтобы посмотреть значения вверх. Это было бы крайне неэффективно для больших карт/определенных ключевых шаблонов, но, предположительно, работало бы. Тем не менее, это была бы реализация специализированной карты, полностью отличная от «обычной». Я думаю, что Go dev решили, что компромисс не принесет никакой пользы.
Два Followup ноты:
Как вы можете видеть, вы можете относительно легко эмулировать только для чтения карты: имеют срез буквального некоторых типов структуры вложения как ключи и значения, отсортированы по клавишам, и оберните его в функцию, которая выполняет поиск двоичного кода .
Я предпочитаю рассматривать константы Их немного как макросы в C-подобный языках: они нетипизированные и чувствует как быть текстуальны (они не , но я говорю о чувстве в конце концов); -)
Обязательно прочтите this для получения большого обзора.
Я думаю, что ответ на вопрос ** почему ** заключается в том, что авторы исследования считают, что сложность реализации не стоит того, что она приносит. – ain
Возможный дубликат [объявить постоянный массив] (http://stackoverflow.com/questions/13137463/declare-a-constant-array) – icza
Я думаю, что вы можете захотеть неизменной карты. Вы не можете объявить неизменяемую карту только потому, что карта в языке Go - это языковая конструкция, но не реализация какого-либо интерфейса «Карта». То есть вы не можете реализовать свою собственную карту, которая совместима (по интерфейсам) с внутренней картой Go. – mezoni