Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Generics
- impoгt "golang.org/x/exp/constraints"
- comparable - сравнимый
- unsigned, signed без/знаковый
- ordered - сортируемый
- integer - все цедые числа
- any - любой
- | Позволяет одной функции обрабатывать несколько типов данных
- | Сокращает дублирование кода
- | Меньше кода = меньше вероятность ошибок
- | Обобщения определяются с использованием интерфейсов (называемых ограничениями)
- | Параметры функции и типы возвращаемых значений ограничены определенным набором интерфейсов
- Синтаксис:
- ----------
- 1 Имя обобщенного типа
- 2 Ограничение / Интерфейс
- 3 "Или"
- 1 2 3
- | | |
- V V V
- func name [Т constraint U constraintA | constraintB](a T,b U ) T {
- // .. }
- func IsEqual[T comparable](a, b T) bool {
- return a == b
- }
- IsEqual(2, 2)
- IsEqual("foo", "bar")
- IsEqual( 'a', 'b')
- IsEqual[uint8](4, 4)
- Создание ограничения
- --------------------
- Ограничение по своей сути это интерфейс!!!!!!
- type Integers32 interface {
- int32 | uint32
- }
- func SumNumbers[T Integers32](arr []T) T
- {
- var sum T
- for i := 0; i < len(arr); i++ {
- sum += arr[i] }
- return sum
- }
- nums := []int32{l, 2, 3}
- nums2 := []uint32{l, 2, 3}
- total := SumNumbers(nums)
- total2 := SumNumbers(nums2)
- Ограничение должно иметь точное соответствие по типу!!!
- type Mylnt int32
- nums := []Mylnt {Mylnt(1), Mylnt(2), Mylnt(3)}
- Хоть Mylnt это псевдоним для int32 функция func SumNumbers
- не сработает
- -------------------------------------------------------
- Приближение (Approximation) ~ означает что функция дожна
- принять все что является int32 или uint32 в независимости
- от имени
- type Integers32 interface {
- ~int32 | ~uint32
- }
- --------------------------------------------------------
- Обобщенная структура
- type MyArray[T constraints.Ordered] struct {
- inner []T
- }
- func (m *MyArray[T]) Max() T {
- max := m.inner[O]
- for i := 0; i < len(m.inner); i++
- { if m inner[i] > max {
- max = m.inner[i]
- }
- return max
- }
- arr := MyArray[int]{inner: []fnt{6, 4, 8, 9, 4, 0}}
- fmt.Printin(arr.Max())
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement