Sobes.tech
Middle+

Jakie środki programowania generycznego istnieją?

sobes.tech AI

Odpowiedź od AI

W Golang istnieją następujące środki programowania generycznego (generics):

  1. 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
    }
    
  2. 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ść.