среда, 13 февраля 2019 г.

Go FAQ: карты (maps) в Go

Почему карты в Go являются встроенным типом?

По той же причине, что и строки: это важная структура данных, обеспечивающая отличную реализацию с синтаксической поддержкой, делающая программирование более приятным. Создатели Go считают, что реализация карт в Go достаточно сильная, чтобы служить для подавляющего большинства применений. Если конкретное приложение может извлечь выгоду из пользовательской реализации, тогда есть смысл написать такую реализацию, но это будет не так удобно синтаксически; это кажется разумным компромиссом.

Почему карты не допускают использование срезов в качестве ключей?

Для просмотра карты требуется оператор равенства, который срезы не реализуют. Они не реализуют равенство, потому что равенство плохо определено для таких типов; есть несколько соображений, касающихся поверхностного и глубокого сравнения, сравнения указателя и значения, как работать с рекурсивными типами и так далее. У разработчиков Go была возможность вернуться к этой проблеме - и реализовать равенство для срезов, что сделало бы недействительными какие-либо существующие программы - но без четкого представления о том, что равенство срезов должно означать, было проще его пока оставить.

В Go 1, в отличие от предыдущих релизов, равенство определено для структур и массивов, поэтому такие типы могут быть использованы в качестве ключей карты. У срезов, однако, все еще нет определения равенства.

Почему карты, срезы и каналы ссылаются, в то время как массивы являются значениями?

По этой теме есть длинная история. Сначала, карты и каналы были синтаксически указателями, и было невозможно объявить или использовать экземпляр без указателя. Также создатели Go боролись с тем, как должны работать массивы. В конце концов было решено, что строгое разделение указателей и значений сделало язык труднее в использовании. Изменение этих типов, чтобы они действовали как ссылки на связанные, совместно используемые структуры данных разрешило эти проблемы. Это изменение добавило прискорбную сложность языку, но оказало большое влияние на удобство использования: Go стал более продуктивным, удобным языком, когда он был представлен.


Читайте также:


Комментариев нет:

Отправить комментарий