Middle+
Jakie środki programowania generycznego istnieją?
sobes.tech AI
Odpowiedź od AI
W Golang istnieją następujące środki programowania generycznego (generics):
-
Typy parametryzowane: Pozwalają tworzyć struktury, interfejsy i funkcje, które mogą działać z różnymi typami danych bez ich sztywnego określania na etapie kompilacji. Typy danych są wskazywane w nawiasach kwadratowych po nazwie typu lub funkcji.
// Przykład struktury z typem parametryzowanym type Stack[T any] struct { elements []T } // Przykład funkcji z typami parametryzowanymi 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 } -
Ograniczenia typów (Type Constraints): Definiują zbiór typów, które mogą być użyte jako parametry generyczne. Pozwalają ograniczyć uniwersalność typów i zapewnić bezpieczeństwo operacji.
- Interfejsy: Każdy interfejs sam w sobie jest ograniczeniem typu.
- Interfejsy łączone: Pozwalają łączyć kilka typów lub interfejsów za pomocą operatora
|.
// Przykład ograniczenia typu z użyciem interfejsu łączonego type Number interface { int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | uintptr | float32 | float64 | complex64 | complex128 } // Funkcja używająca ograniczenia typu func Add[T Number](a, b T) T { return a + b }
Te środki zostały dodane w Go 1.18. Przed tym, aby zaimplementować coś podobnego do generyków, używano interfejsów (interface{}) i refleksji, co obniżało bezpieczeństwo typów i wydajność.