- Основной синтаксис:
Давайте начнем с синтаксиса определения универсальной функции с использованием параметров типа:
func MyGenericFunc[T any](arg T) {
// Function body
}
Часть [T any]
после имени функции указывает, что эта функция является универсальной, а T
— это параметр типа, который может представлять любой тип.
- Создание универсальных структур данных:
Параметры типа Go позволяют создавать общие структуры данных, такие как связанные списки и стеки, которые могут работать с любым типом данных. Вот пример реализации общего связанного списка:
type Node[T any] struct {
data T
next *Node[T]
}
type LinkedList[T any] struct {
head *Node[T]
}
func (l *LinkedList[T]) Add(data T) {
// Add implementation
}
func (l *LinkedList[T]) Remove(data T) {
// Remove implementation
}
- Применение ограничений:
Параметры типа также могут иметь ограничения, позволяющие ограничить допустимые типы. Например, вы можете ограничить работу универсальной функции только с типами, реализующими определенный интерфейс:
type Printable interface {
Print()
}
func PrintData[T Printable](data T) {
data.Print()
}
- Общие алгоритмы:
Параметры типа позволяют писать общие алгоритмы, которые могут работать с разными типами. Вот пример общей функции сортировки с использованием параметров типа:
func Sort[T comparable](arr []T) {
// Sorting implementation
}
- Утверждения типов:
Вы можете использовать утверждения типа с параметрами типа для выполнения проверок и преобразований во время выполнения:
func ProcessData[T any](data T) {
if value, ok := data.(int); ok {
// Process integer value
} else if value, ok := data.(string); ok {
// Process string value
}
// ...
}
Параметры типа Go привносят в язык программирования Go возможности обобщений, позволяя писать более гибкий и пригодный для повторного использования код. В этой статье мы рассмотрели базовый синтаксис параметров типа, создание универсальных структур данных, применение ограничений, написание универсальных алгоритмов и использование утверждений типов. Использование параметров типа, несомненно, улучшит ваш опыт кодирования и сделает ваш код более кратким и удобным в сопровождении. Так что вперед, используйте возможности дженериков Go и откройте совершенно новый уровень возможностей программирования!