Типовые контракты и паттерны

Ограничения-интерфейсы можно вкладывать друг в друга:

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Упражнение 1medium
2Упражнение 2hard