0Pricing
Go Academy · Урок

Синтаксис параметров типов

Обобщённые функции и типы с [T any]

«Синтаксис параметров типов» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Предпосылки появления обобщений

До Go 1.18 код, работающий с несколькими типами, требовал либо interface{}/any (с потерей типобезопасности), либо генерации кода. Обобщения добавляют параметры типов для полиморфизма во время компиляции.

Синтаксис обобщённых функций

Объявляйте параметры типов в квадратных скобках после имени функции:

func Map[T, U any](s []T, f func(T) U) []U {
    result := make([]U, len(s))
    for i, v := range s {
        result[i] = f(v)
    }
    return result
}

nums := Map([]int{1,2,3}, func(n int) string {
    return strconv.Itoa(n)
})

Вывод типов

В большинстве случаев компилятор выводит аргументы типов из аргументов функции. Если вывести их не удаётся, можно указать их явно.

// Inferred:
nums := Map([]int{1,2,3}, strconv.Itoa)
// Explicit:
nums := Map[int, string]([]int{1,2,3}, strconv.Itoa)

Обобщённые типы

Структуры и другие типы также могут иметь параметры типов:

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 zero T; return zero, false }
    n := len(s.items)-1
    v := s.items[n]
    s.items = s.items[:n]
    return v, true
}

Несколько параметров типов

Функции и типы могут иметь несколько параметров типов:

type Pair[K, V any] struct { Key K; Value V }

func Zip[K, V any](keys []K, vals []V) []Pair[K, V] {
    result := make([]Pair[K, V], min(len(keys), len(vals)))
    for i := range result {
        result[i] = Pair[K, V]{keys[i], vals[i]}
    }
    return result
}

Нулевое значение параметра типа

Объявите переменную с нулевым значением с помощью var zero T. Это необходимо, когда обобщённая функция должна вернуть результат «без значения».

func First[T any](s []T) (T, bool) {
    if len(s) == 0 { var zero T; return zero, false }
    return s[0], true
}

Методы обобщённых типов

Методы обобщённого типа используют параметры этого типа, а не собственные параметры. Метод не может вводить дополнительные параметры типов.

type Pair[K, V any] struct{ K K; V V }
func (p Pair[K, V]) Swap() Pair[V, K] { return Pair[V, K]{p.V, p.K} }

Инстанцирование

Использование обобщённого типа с конкретным аргументом типа называется инстанцированием. Оно происходит во время компиляции, а не выполнения — дополнительных затрат на упаковку нет.

s := Stack[int]{}
s.Push(42)

Псевдонимы и обобщённые типы

Можно создавать псевдонимы типов для инстанцированных обобщённых типов:

type IntStack = Stack[int]

Ограничения

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

Когда использовать обобщения

Используйте обобщения для алгоритмов, действительно не зависящих от типа (контейнерных типов и функциональных вспомогательных функций, таких как Map/Filter/Reduce), если альтернативой было бы дублирование кода или небезопасные приведения типов.

Быстрая проверка

Где объявляются параметры типов в обобщённой функции?

Итоги: синтаксис параметров типов

Основные положения:

  • Параметры типов указываются в квадратных скобках: func Foo[T any](...)
  • Работают с функциями и типами (структурами и т. д.)
  • В большинстве случаев компилятор выводит аргументы типов из аргументов
  • Нулевое значение: var zero T; параметры типов на уровне методов отсутствуют

Часто задаваемые вопросы

Урок «Синтаксис параметров типов» бесплатный?

Да — полный текст урока «Синтаксис параметров типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Синтаксис параметров типов»?

Обобщённые функции и типы с [T any] Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Синтаксис параметров типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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