Синтаксис параметров типов
Обобщённые функции и типы с [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 — локальная установка не требуется.
Все уроки этого курса
- Синтаксис параметров типов
- Ограничения: comparable и интерфейсы
- Обобщённые структуры данных
- Обобщения на практике: подводные камни