Advertisement
AlexNovoross87

generic-template

May 15th, 2025
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.69 KB | None | 0 0
  1. Generics
  2.  
  3. impoгt "golang.org/x/exp/constraints"
  4. comparable - сравнимый
  5. unsigned, signed без/знаковый
  6. ordered - сортируемый
  7. integer - все цедые числа
  8. any - любой
  9.  
  10.  
  11. | Позволяет одной функции обрабатывать несколько типов данных
  12. | Сокращает дублирование кода
  13. | Меньше кода = меньше вероятность ошибок
  14. | Обобщения определяются с использованием интерфейсов (называемых ограничениями)
  15. | Параметры функции и типы возвращаемых значений ограничены определенным набором интерфейсов
  16.  
  17. Синтаксис:
  18. ----------
  19. 1 Имя обобщенного типа
  20. 2 Ограничение / Интерфейс
  21. 3 "Или"
  22.            1    2                     3
  23.            |    |                     |
  24.            V    V                     V
  25. func name [Т constraint U constraintA | constraintB](a T,b U ) T {
  26. // .. }
  27.  
  28. func IsEqual[T comparable](a, b T) bool {
  29.     return a == b
  30. }
  31.  
  32. IsEqual(2, 2)
  33. IsEqual("foo", "bar")
  34. IsEqual( 'a', 'b')
  35. IsEqual[uint8](4, 4)
  36.  
  37.  
  38. Создание ограничения
  39. --------------------
  40. Ограничение по своей сути это интерфейс!!!!!!
  41.  
  42. type Integers32 interface {
  43.     int32 | uint32
  44. }
  45.  
  46. func SumNumbers[T Integers32](arr []T) T
  47. {
  48.     var sum T
  49.     for i := 0; i < len(arr); i++ {
  50.     sum += arr[i] }
  51.     return sum
  52. }
  53. nums := []int32{l, 2, 3}
  54. nums2 := []uint32{l, 2, 3}
  55. total := SumNumbers(nums)
  56. total2 := SumNumbers(nums2)
  57.  
  58.  
  59. Ограничение должно иметь точное соответствие по типу!!!
  60. type Mylnt int32
  61. nums := []Mylnt {Mylnt(1), Mylnt(2), Mylnt(3)}
  62.  
  63. Хоть Mylnt это псевдоним для int32 функция func SumNumbers
  64. не сработает
  65.  
  66. -------------------------------------------------------
  67.  
  68. Приближение (Approximation) ~ означает что функция дожна
  69. принять все что является int32 или uint32 в независимости
  70. от имени
  71. type Integers32 interface {
  72.     ~int32 | ~uint32
  73. }
  74.  
  75. --------------------------------------------------------
  76.  
  77. Обобщенная структура
  78.  
  79. type MyArray[T constraints.Ordered] struct {
  80.     inner []T
  81. }
  82.  
  83. func (m *MyArray[T]) Max() T {
  84. max := m.inner[O]
  85. for i := 0; i < len(m.inner); i++
  86. { if m inner[i] > max {
  87. max = m.inner[i]
  88. }
  89. return max
  90. }
  91. arr := MyArray[int]{inner: []fnt{6, 4, 8, 9, 4, 0}}
  92. fmt.Printin(arr.Max())
  93.  
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement