Ограничения типов

Ограничение (constraint) задаёт, что умеет тип-параметр. Любой интерфейс можно использовать как ограничение:

type Stringer interface {
    String() string
}

func Print[T Stringer](v T) {
    fmt.Println(v.String())
}

Ограничение может перечислять конкретные типы через |:

type Number interface {
    int | int32 | int64 | float32 | float64
}

func Sum[T Number](s []T) T {
    var total T
    for _, v := range s {
        total += v
    }
    return total
}

~int означает «int и любой именованный тип с базовым типом int»:

type Celsius float64

type Temperature interface {
    ~float64
}

func ToKelvin[T Temperature](t T) T {
    return t + 273.15
}

fmt.Println(ToKelvin(Celsius(100)))  // 373.15

Стандартный пакет golang.org/x/exp/constraints содержит готовые ограничения:

import "golang.org/x/exp/constraints"

func Min[T constraints.Ordered](a, b T) T {
    if a < b { return a }
    return b
}

constraints.Ordered — все типы, поддерживающие <, >, <=, >=.


ЗаданиеСложность
1Упражнение 1medium
2Упражнение 2medium