38 Практика
Что такое дженерики и зачем ограничение типа?
Ответ
Параметр типа пишется в квадратных скобках: func Min[T cmp.Ordered](a, b T) T. Один и тот же код работает для всех типов, которые подходят под ограничение. cmp.Ordered означает «можно сравнить через <»: числа и строки. any не даёт сравнивать, потому что под ним годится любой тип.
Подробнее
Ограничение — это интерфейс. В нём бывают методы и набор типов: interface{ ~int | ~string }. Тильда ~ включает и именованные типы с таким исходным типом, например type Status int.
Дженерик уместен, когда алгоритм один, а типы разные: контейнер, Min, хелпер для срезов. Если различается поведение, обычный интерфейс с методом яснее.
package main
import (
"cmp"
"fmt"
)
func Min[T cmp.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
func main() {
fmt.Println(Min(3, 1))
fmt.Println(Min("b", "a"))
}