0Pricing
Go Academy · Урок

Обобщённые структуры данных

Создание обобщённых 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 — локальная установка не требуется.

Все уроки этого курса

  1. Синтаксис параметров типов
  2. Ограничения: comparable и интерфейсы
  3. Обобщённые структуры данных
  4. Обобщения на практике: подводные камни
← Назад к Go Academy