Ограничения: comparable и интерфейсы
Объединяющие ограничения и встроенный тип comparable
«Ограничения: comparable и интерфейсы» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое ограничение
Ограничение определяет, какие типы можно использовать в качестве аргумента типа. Без ограничения параметр типа имеет значение any (пустой интерфейс — поддерживаются только присваивание и сравнение с помощью ==).
Ограничение any
any (псевдоним для interface{}) — самое широкое ограничение: ему удовлетворяют все типы. Можно использовать только операции, поддерживаемые всеми типами: присваивание и передачу параметрам интерфейса.
func Print[T any](v T) { fmt.Println(v) }Ограничение comparable
comparable ограничивает параметр типа типами, поддерживающими == и !=. Оно необходимо, чтобы использовать тип в качестве ключа Map или в проверках равенства.
func Contains[T comparable](s []T, v T) bool {
for _, item := range s {
if item == v { return true }
}
return false
}Ограничения-интерфейсы
Используйте интерфейс как ограничение, чтобы потребовать наличия определённых методов. Параметр типа должен иметь все методы интерфейса.
type Stringer interface { String() string }
func Print[T Stringer](v T) {
fmt.Println(v.String())
}Объединяющие ограничения
Используйте объединение типов с помощью |, чтобы ограничить параметр набором конкретных типов. Это позволяет использовать операторы (например, +), которые не входят ни в один интерфейс.
type Number interface {
int | int64 | float64
}
func Sum[T Number](s []T) T {
var total T
for _, v := range s { total += v }
return total
}~T для базовых типов
Используйте ~T, чтобы включить не только T, но и все типы, базовым типом которых является T (например, пользовательские типы, определённые как type MyInt int).
type Integer interface { ~int | ~int64 }
type MyInt int
// MyInt satisfies Integer because its underlying type is intgolang.org/x/exp/constraints
Пакет constraints предоставляет распространённые интерфейсы-ограничения: Ordered (поддерживает оператор <), Integer, Float, Signed, Unsigned.
import "golang.org/x/exp/constraints"
func Min[T constraints.Ordered](a, b T) T {
if a < b { return a }
return b
}Пакет cmp (Go 1.21)
В Go 1.21 в стандартную библиотеку добавлены ограничение cmp.Ordered и функции cmp.Compare/cmp.Less, заменившие зависимость exp/constraints.
import "cmp"
func Min[T cmp.Ordered](a, b T) T { return min(a, b) }Объединение ограничений
Встраивайте несколько интерфейсов в ограничение, чтобы требовать соблюдения нескольких свойств:
type Printable interface {
comparable
fmt.Stringer
}Вывод ограничений
Компилятор выводит параметры типов из аргументов. Если ограничение слишком широкое (any), для управления выводом могут потребоваться явные аргументы типов.
Когда использовать comparable
Используйте comparable, если обобщённой функции нужно применять оператор == к значениям, хранить их в отображениях как ключи или использовать их как элементы отображения/множества. Не все типы поддерживают сравнение (срезы, отображения и функции — нет).
Быстрая проверка
Что означает префикс ~ в объединённом ограничении, таком как ~int?
Повторение: ограничения
Основные моменты:
- any: наиболее широкое ограничение; comparable: поддерживает ==; интерфейс: требует наличия методов
- Объединение (int|float64) позволяет использовать арифметические операторы
- ~T включает именованные типы, базовым типом которых является T
- cmp.Ordered (Go 1.21+) для ограничений с операторами <, >, <=, >=
Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Ограничения: comparable и интерфейсы» бесплатный?
Да — полный текст урока «Ограничения: comparable и интерфейсы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ограничения: comparable и интерфейсы»?
Объединяющие ограничения и встроенный тип comparable Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Ограничения: comparable и интерфейсы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Синтаксис параметров типов
- Ограничения: comparable и интерфейсы
- Обобщённые структуры данных
- Обобщения на практике: подводные камни