Мне действительно нравится golang golang, но может кто-нибудь объяснить, в чем смысл того, что разработчики оставили базовую структуру данных, такую как наборы из стандартной библиотеки?
69
Мне действительно нравится golang golang, но может кто-нибудь объяснить, в чем смысл того, что разработчики оставили базовую структуру данных, такую как наборы из стандартной библиотеки?
Ответы:
Одна из возможных причин этого упущения заключается в том, что моделирование наборов с помощью карты действительно легко.
Честно говоря, я думаю, что это тоже немного упущение, однако, глядя на Perl, история точно такая же. В Perl вы получаете списки и хеш-таблицы, в Go вы получаете массивы, фрагменты и карты. В Perl вы обычно используете хеш-таблицу для любых проблем, связанных с набором, то же самое применимо к Go.
пример
чтобы подражать множеству целых в Go, мы определяем карту:
Добавить что-либо так же просто, как:
Удалить что-то просто
И потенциальная неловкость этой конструкции легко абстрагируется:
И удалить и получить можно определить аналогично, у меня есть полная реализация здесь . Основным недостатком здесь является тот факт, что у Go нет дженериков. Однако это можно сделать
interface{}
в том случае, если вы приведете результаты get.источник
map[int]bool
одного можно использоватьmap[int]struct{}
вместо. Я предпочитаю последнее.map[int]struct{}
..struct{}
занимает 0 байтов.map[int]struct{}
вами нельзя сделать,if mymap["key"] {
чтобы проверить на членство. Google рекомендует использоватьbool
(поиск «Набор может быть реализован»).Я думаю, что это связано с
golang
простотой.set
ы стать очень полезным сdifference
,intersection
,union
,issubset
и так далее .. методы. Возможно,golang
команда почувствовала, что это слишком много для одной структуры данных. Но в противном случае «тупой набор» , который только имеетadd
,contains
иremove
может быть легко тиражироваться с ,map
как объяснено @jozefg.источник
Предыдущий ответ работает ТОЛЬКО ЕСЛИ ключ встроенного типа. Чтобы дополнить предыдущий ответ, вот способ реализовать набор, элементы которого являются пользовательскими типами:
источник
type mySet map[IntPoint]bool
работает на отлично Все, что требуется от типа ключа, используемого в карте, - это наличие==
и!=
. Равенство типов структур хорошо определено, вашEquals
метод должен быть справедливымp1 == p2
.Contains
занимает линейное время, ноaMap[]
требует постоянного времени, независимо от количества членов. Лучшим решением было бы создать внутри себя уникальный ключ, основанный на содержимом каждого члена, и использовать запросы постоянного времени, которыеmap
предоставляет тип. Существуют и более быстрые решения, которые учитывают поведение кэша и т. Д.