Sobes.tech
Назад к вопросам
Middle+
4

Что такое дженерики в Go? Как ограничить набор типов (constraints)?

Компании, где спрашивали
YadroYadro

Ответ от нейросети

sobes.tech AI

Дженерики в Go позволяют писать обобщённый код, который работает с разными типами данных, сохраняя при этом типобезопасность.

Ограничения (constraints) — это интерфейсы, которые задают набор требований к типам, которые можно использовать в параметрах дженериков. Они позволяют ограничить допустимые типы, например, только числовые или только типы, реализующие определённый интерфейс.

Пример ограничения с использованием встроенного интерфейса constraints.Ordered (из пакета 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
}

Здесь функция Min принимает два параметра типа T, где T ограничен типами, поддерживающими оператор <.

Можно также создавать свои собственные ограничения:

type Number interface {
    ~int | ~int64 | ~float64
}

func Sum[T Number](a, b T) T {
    return a + b
}

Здесь Number — пользовательский constraint, который разрешает только указанные числовые типы (символ ~ означает, что допускаются типы с базовым типом из перечисленных).

Таким образом, дженерики и constraints позволяют писать гибкий и безопасный код, ограничивая набор допустимых типов для параметров функций и структур.