2016-06-23 3 views
7

Я хотел бы создать постоянную карту вроде следующего:Почему Golang не позволяет создавать карты const?

const (
    running = map[string]string{ 
     "one": "ONE", 
     "two": "TWO", 
    } 
) 

однако всякий раз, когда я я получаю следующее сообщение об ошибке:

const initializer map[string]string literal is not a constant

Почему это так, почему Golang не рассматривать их как любую другую переменную?

+1

Я думаю, что ответ на вопрос ** почему ** заключается в том, что авторы исследования считают, что сложность реализации не стоит того, что она приносит. – ain

+3

Возможный дубликат [объявить постоянный массив] (http://stackoverflow.com/questions/13137463/declare-a-constant-array) – icza

+0

Я думаю, что вы можете захотеть неизменной карты. Вы не можете объявить неизменяемую карту только потому, что карта в языке Go - это языковая конструкция, но не реализация какого-либо интерфейса «Карта». То есть вы не можете реализовать свою собственную карту, которая совместима (по интерфейсам) с внутренней картой Go. – mezoni

ответ

7

От https://golang.org/ref/spec#Constants:

A constant value is represented by a rune, integer, floating-point, imaginary, or string literal, an identifier denoting a constant, a constant expression, a conversion with a result that is a constant, or the result value of some built-in functions such as unsafe.Sizeof applied to any value, cap or len applied to some expressions, real and imag applied to a complex constant and complex applied to numeric constants.

Т.Л., Д.Р. только числовые типы, строки и Bools могут быть константы, массивы, ломтиков и карты не числовой тип.

0

Мой взгляд на это, что это решение было чисто прагматическое: Go это язык очень вниз к Земле (в отличии от других — «более пуристом» — языков), и одна интересного свойства некоторого отображения реального мира что простой доступ к ним для чтения может обновить их внутреннее представление (!). Скажем, они могут собирать и хранить некоторую статистику об их использовании, или они могут перебалансировать базовое дерево, содержащее ведра ценности и т. Д. Разрешение «const-карты» будет означать явное указание набора сложных ограничений на него в спецификации языка —, что, возможно, потребует реализации двух реализаций карты.

Вы также можете попробовать взглянуть на него под другим углом: рассмотреть константу строки. Такая вещь может быть легко встроена в секциюрезультирующего двоичного кода и быть фактически представлена ​​адресом этих данных в памяти (ну, строки в Go сложнее, но не будем игнорировать эту деталь). То есть, постоянная строка может быть действительно «статической»: это просто серия статических байтов R/O в памяти — так же просто. И наоборот, карта представляет собой сложный зверь, оснащенный сложным механизмом, и каждая карта представляет собой специальный сложный объект , созданный в режиме исполнения. Вот почему вы даже не можете просто объявить карту и использовать ее: вы должны make() это первый — как каналы, и по той же причине.

Опять же, некоторые хаки могут быть сделаны для поддержки постоянных карт. Скажем, реализация могла бы сортировать ключи вашей карты вверх, сериализовать ее (со значениями) в смежную область данных R/O, а затем использовать бинарный поиск во время выполнения, чтобы посмотреть значения вверх. Это было бы крайне неэффективно для больших карт/определенных ключевых шаблонов, но, предположительно, работало бы. Тем не менее, это была бы реализация специализированной карты, полностью отличная от «обычной». Я думаю, что Go dev решили, что компромисс не принесет никакой пользы.

Два Followup ноты:

  • Как вы можете видеть, вы можете относительно легко эмулировать только для чтения карты: имеют срез буквального некоторых типов структуры вложения как ключи и значения, отсортированы по клавишам, и оберните его в функцию, которая выполняет поиск двоичного кода .

  • Я предпочитаю рассматривать константы Их немного как макросы в C-подобный языках: они нетипизированные и чувствует как быть текстуальны (они не , но я говорю о чувстве в конце концов); -)

    Обязательно прочтите this для получения большого обзора.

Смежные вопросы