Одна из самых интересных структур данных, встроенных в Python, - это OrderedDict. Он позволяет выполнять поиск O (1) через словарь, а также обеспечивает итерацию на основе порядка, в котором вы вставляли в него элементы. Реальным вариантом использования для этого может быть магазин сэндвичей. Мы хотим обрабатывать клиентов по порядку, но если клиент где-то в середине строки уходит, мы могли бы перебрать все элементы, чтобы удалить их, но если у нас есть хеш-карта (или словарь в Python), мы можем удалить их за время O (1). Я сам пробовал реализовать это на Python, и это не слишком много кода, поэтому я подумал, что попробую его на Go.

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

… Сопоставимые типы - это логические, числовые, строковые, указатели, каналы и интерфейсы, а также структуры или массивы, содержащие только эти типы.

Для простоты я сделал ключ строкой, однако map[interface{}]interface{} также действителен и позволит нам использовать в качестве ключа «любое» значение.



Весь файл состоит почти из 50 строк кода. Более сложной частью является реализация связанного списка, содержащая чуть менее 70 строк кода.



Я также написал несколько тестов, чтобы убедиться, что все действительно работает и, кажется, ведет себя так, как я ожидал. В целом я думаю, что эта реализация сравнима с той, которую я написал на Python.

Одна из наиболее интересных частей - итерация (через .Iterate()); Недавно я читал о ленивых оценках в Go, и они предложили использовать каналы. Мне это не нравится, но интерфейс чистый, а тот факт, что он использует канал, по большей части скрыт.