Alright так как мы идем из руби, я сталкнулся с этим явлением впервые, и что не мало важно в видосах озона этого нету.
Суть в кратце это функции которые могут работать с разными типами, но так же этот функционал может использоваться для объяления кастомных типов.
Синтаксически это выглядит так - после названия функции и перед аргументами в квадратных скобочках пишем возможные типы
func printValue[T int32](value T) {
fmt.Println(value)
}
Далее написаное будет касаться букв/слов в квадратных скобочках
В примере выше мы явно указали только один тип, как будто могли и без дженерика обойтись.
📌Можно добавить еще один через пайп оператор [ T int32 | int16 ] таким образом мы можем принимать любой из двух типов.
📌Что бы не писать все возможные комбинации, в стд либ есть пакет который предлагает пресеты типов, например [ T Integer ] в котором все инты соответственно.
📌Если мы создали кастом тип, который является по сути наследником стандартного типа, то для включения его в список допустимых типов используется синтаксис тильды [ T ~int32 ]
📌И самое сложное однако часто встречающееся так как добавили синтаксический сахар шугаринг хуюгаринг(с) Когда функция принимает слайс(массив)
мож определить как [ U ~[]T, T any ] что значит наш генерик будет принимать массивы с любыми типами внутри.
По последнему пункту я не уверен в корректности объяснения на ноушн добавлю ссылки про генерики, и продублирую тут.
medium.com/the-godev-corner/go-generics-everything-you-need-to-know-52dd3796d8a1#143b
benjiv.com/golang-generics-introduction
youtu.be/Pa_e9EeCdy8?si=e_DJaIMRdNa8jk-z
🔝🔝🔝🔝🔝🔝🔝🔝