Подходит ли Go для структур данных и алгоритмов?
Да. Он компилируется в быстрый нативный код, его синтаксис настолько компактен, что при чтении вы видите в основном сам алгоритм, а дженерики (начиная с Go 1.18) позволяют переиспользовать типизированный стек или кучу. Обратная сторона в скромной стандартной библиотеке: помимо слайсов, map, container/list и container/heap структуры вы пишете сами, а на учебном пути в этом и смысл. К тому же на Go работает значительная часть современной облачной инфраструктуры, включая Docker и Kubernetes, поэтому он естественный язык собеседований на бэкенд-роли.
Какие типы и пакеты Go каким структурам данных соответствуют?
Слайс представляет собой динамический массив, а с append и повторными срезами он же служит вам стеком; map является хеш-таблицей, и идиоматичным множеством считается map[T]struct{}; container/list реализует двусвязный список; а container/heap поддерживает двоичную кучу поверх любого типа, реализующего heap.Interface. Типа очереди, дерева, префиксного дерева или графа нет, так что их вы пишете сами, на первом и втором шагах.
Как работает container/heap в Go?
Вы реализуете heap.Interface на собственном типе слайса: Len, Less и Swap из sort.Interface, а также Push и Pop, которые лишь добавляют элемент в конец слайса и удаляют его оттуда. Затем вы вызываете функции пакета heap.Push и heap.Pop, а не собственные методы, и они выполняют просеивание вверх и вниз, которое поддерживает порядок. Это выглядит странно, пока вы сами не напишете кучу, а это вы делаете на втором шаге.
Почему при обходе map в Go каждый раз получается другой порядок?
Потому что Go намеренно делает порядок обхода map случайным, чтобы ни одна программа не начала от него зависеть. У хеш-таблицы нет осмысленного порядка ни в одном языке; Go просто следит за тем, чтобы вы это заметили. Когда порядок важен, например в выводе, который сравнивает тест, соберите ключи в слайс и отсортируйте его или храните слайс рядом с map.
Какие курсы этого пути не преподаются на Go?
Три: динамическое программирование и серия по интервью на Python преподаются на Python, а битовые операции на C++. Они перечислены после шагов, каждый со ссылкой, которая открывает курс на его собственном языке. Таблица мемоизации в Go представляет собой слайс или map, а ещё в Go есть битовый оператор, которого нет в C++: &^, AND NOT, который сбрасывает в левом операнде все биты, установленные в правом.
Нужно ли знать Go, прежде чем начинать этот путь?
Как минимум структуры, указатели, слайсы, map и методы; дженерики пригодятся, и их можно освоить по ходу. Если это для вас новое, курс Go от Coddy сначала бесплатно доведёт вас до этого уровня, а этот путь начинается там, где он заканчивается.