Обобщённые структуры данных
Создание обобщённых Stack и Set
«Обобщённые структуры данных» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Зачем нужны обобщённые структуры данных
До появления обобщений разработчики Go использовали срезы interface{} (теряя безопасность типов) или генерировали код для каждого типа. Обобщения позволяют создавать безопасные по типам повторно используемые контейнеры.
Обобщённый стек
Безопасный по типам стек с использованием обобщённого типа:
type Stack[T any] struct{ items []T }
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items)==0 { var z T; return z, false }
n := len(s.items)-1; v := s.items[n]; s.items = s.items[:n]; return v, true
}
func (s *Stack[T]) Len() int { return len(s.items) }Обобщённая очередь
Очередь FIFO на основе среза:
type Queue[T any] struct{ items []T }
func (q *Queue[T]) Enqueue(v T) { q.items = append(q.items, v) }
func (q *Queue[T]) Dequeue() (T, bool) {
if len(q.items)==0 { var z T; return z, false }
v := q.items[0]; q.items = q.items[1:]; return v, true
}Обобщённое множество
Множество на основе отображения — тип ключа должен поддерживать сравнение:
type Set[T comparable] struct{ m map[T]struct{} }
func NewSet[T comparable]() *Set[T] { return &Set[T]{m: make(map[T]struct{})} }
func (s *Set[T]) Add(v T) { s.m[v] = struct{}{} }
func (s *Set[T]) Has(v T) bool { _, ok := s.m[v]; return ok }
func (s *Set[T]) Delete(v T) { delete(s.m, v) }Вспомогательная функция Map для обобщённых типов
Безопасная по типам функциональная операция Map над срезами:
func Map[T, U any](s []T, f func(T) U) []U {
out := make([]U, len(s))
for i, v := range s { out[i] = f(v) }
return out
}Обобщённая операция Filter
Верните новый срез, содержащий только элементы, удовлетворяющие предикату:
func Filter[T any](s []T, predicate func(T) bool) []T {
var out []T
for _, v := range s {
if predicate(v) { out = append(out, v) }
}
return out
}Обобщённая операция Reduce
Сверните срез в одно значение:
func Reduce[T, U any](s []T, init U, f func(U, T) U) U {
acc := init
for _, v := range s { acc = f(acc, v) }
return acc
}OrderedMap
Упорядоченное отображение, сохраняющее порядок вставки, — полезно для сериализации JSON со стабильным порядком ключей:
type OrderedMap[K comparable, V any] struct {
keys []K
vals map[K]V
}Обобщённый связный список
Двусвязный список с безопасными по типам элементами:
type Node[T any] struct{ Val T; Next, Prev *Node[T] }
type List[T any] struct{ head, tail *Node[T]; len int }Ограничения
Обобщённые типы не могут использовать переключатели типов для T. Методы обобщённых типов не могут добавлять новые параметры типов. Нельзя специализировать обобщённый тип для конкретного T (специализация шаблонов не поддерживается).
Производительность
Инстанцирование обобщённых типов в Go выполняется через «формы GC»: типы с одинаковой структурой памяти используют одну реализацию. Это позволяет избежать разрастания кода, сохраняя производительность, близкую к производительности конкретных реализаций.
Когда не следует использовать обобщения
Избегайте обобщений в простых случаях, когда достаточно интерфейса, а также если у вас есть всего один или два конкретных типа: дополнительная сложность перевешивает преимущества.
Быстрая проверка
Почему обобщённому Set требуется ограничение comparable для его параметра типа?
Повторение: обобщённые структуры данных
Основные моменты:
- Stack, Queue, Set — безопасны по типам благодаря обобщениям
- Функциональные вспомогательные операции: Map, Filter, Reduce над []T
- Set[T comparable] для множеств на основе отображений
- Нет параметров типов на уровне методов; специализация шаблонов не поддерживается
Часто задаваемые вопросы
Урок «Обобщённые структуры данных» бесплатный?
Да — полный текст урока «Обобщённые структуры данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обобщённые структуры данных»?
Создание обобщённых Stack и Set Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Обобщённые структуры данных»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Синтаксис параметров типов
- Ограничения: comparable и интерфейсы
- Обобщённые структуры данных
- Обобщения на практике: подводные камни