Назад к вопросам
Middle+
121
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech 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{}) и рефлексия, что приводило к снижению типобезопасности и производительности.