Sobes.tech
Middle+

Какви средства за обобщено програмиране съществуват?

sobes.tech AI

Отговор от AI

В Golang съществуват следните средства за обобщено програмиране (генерики):

  1. Параметризирани типове: Позволяват създаването на структури, интерфейси и функции, които могат да работят с различни типове данни без тяхното строго указване по време на компилация. Типовете данни се посочват в квадратни скоби след името на типа или функцията.

    // Пример за структура с параметризиран тип
    type Stack[T any] struct {
    	elements []T
    }
    
    // Пример за функция с параметризирани типове
    func Map[T, U any](collection []T, f func(T) U) []U {
    	result := make([]U, len(collection))
    	for i, item := range collection {
    		result[i] = f(item)
    	}
    	return result
    }
    
  2. Типови ограничения (Type Constraints): Определят набор от типове, които могат да бъдат използвани като параметри на генериците. Те позволяват да се ограничи универсалността на типовете и да се осигури безопасност на операциите.

    • Интерфейси: Всеки интерфейс сам по себе си е типово ограничение.
    • Обединени интерфейси: Позволяват обединяването на няколко типа или интерфейси с помощта на оператора |.
    // Пример за типово ограничение с използване на обединен интерфейс
    type Number interface {
    	int | int8 | int16 | int32 | int64 |
    		uint | uint8 | uint16 | uint32 | uint64 | uintptr |
    		float32 | float64 |
    		complex64 | complex128
    }
    
    // Функция, използваща типово ограничение
    func Add[T Number](a, b T) T {
    	return a + b
    }
    

Тези средства бяха добавени в Go 1.18. Преди това за реализиране на подобна функционалност се използваха интерфейси (interface{}) и рефлексия, което намаляваше типовата безопасност и производителността.