Все вопросы

38 Практика

Что такое дженерики и зачем ограничение типа?

Параметр типа пишется в квадратных скобках: func Min[T cmp.Ordered](a, b T) T. Один и тот же код работает для всех типов, которые подходят под ограничение. cmp.Ordered означает «можно сравнить через <»: числа и строки. any не даёт сравнивать, потому что под ним годится любой тип.

Ограничение — это интерфейс. В нём бывают методы и набор типов: interface{ ~int | ~string }. Тильда ~ включает и именованные типы с таким исходным типом, например type Status int.

Дженерик уместен, когда алгоритм один, а типы разные: контейнер, Min, хелпер для срезов. Если различается поведение, обычный интерфейс с методом яснее.

Пример

Go

один 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"))
}