Типовые контракты и паттерны
Комбинирование ограничений
Ограничения-интерфейсы можно вкладывать друг в друга:
type Numeric interface {
constraints.Integer | constraints.Float
}
type Printable interface {
fmt.Stringer
comparable
}
comparable — встроенное ограничение: тип поддерживает == и !=.
Дженерик-функции стандартной библиотеки
Начиная с Go 1.21 стандартная библиотека использует дженерики:
import "slices"
nums := []int{3, 1, 4, 1, 5}
slices.Sort(nums)
idx, _ := slices.BinarySearch(nums, 4)
fmt.Println(idx) // 3
import "maps"
m := map[string]int{"a": 1, "b": 2}
keys := maps.Keys(m)
Когда использовать дженерики
| Ситуация | Подход |
|---|---|
| Алгоритм работает одинаково для любых типов (сортировка, поиск) | дженерики |
| Контейнер хранит элементы произвольного типа | дженерики |
| Поведение зависит от типа на этапе выполнения | интерфейс |
| Один конкретный тип | без дженериков |
Дженерики не заменяют интерфейсы — они дополняют их там, где важна типобезопасность на этапе компиляции.
Упражнения
| № | Задание | Сложность |
|---|---|---|
| 1 | Упражнение 1 | medium |
| 2 | Упражнение 2 | hard |