Ograniczenia: comparable i interfejsy
Ograniczenia unii i wbudowany typ comparable
Ograniczenia: comparable i interfejsy to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Czym jest ograniczenie?
Ograniczenie określa, które typy mogą być używane jako argument typu. Bez ograniczenia parametr typu ma wartość any (pusty interfejs — obsługuje tylko przypisywanie oraz porównywanie za pomocą ==).
Ograniczenie any
any (alias dla interface{}) jest najszerszym ograniczeniem — spełniają je wszystkie typy. Można używać tylko operacji obsługiwanych przez wszystkie typy: przypisywania i przekazywania do parametrów interfejsu.
func Print[T any](v T) { fmt.Println(v) }Ograniczenie comparable
comparable ogranicza parametr typu do typów obsługujących == i !=. Jest wymagane do użycia typu jako klucza mapy lub w sprawdzaniu równości.
func Contains[T comparable](s []T, v T) bool {
for _, item := range s {
if item == v { return true }
}
return false
}Ograniczenia interfejsowe
Proszę użyć interfejsu jako ograniczenia, aby wymagać określonych metod. Parametr typu musi mieć wszystkie metody interfejsu.
type Stringer interface { String() string }
func Print[T Stringer](v T) {
fmt.Println(v.String())
}Ograniczenia unii
Proszę użyć unii typów z |, aby ograniczyć parametr do zbioru konkretnych typów. Umożliwia to używanie operatorów (takich jak +), które nie należą do żadnego interfejsu.
type Number interface {
int | int64 | float64
}
func Sum[T Number](s []T) T {
var total T
for _, v := range s { total += v }
return total
}~T dla typów bazowych
Użycie ~T obejmuje nie tylko typ T, lecz także wszystkie typy, których typem bazowym jest T (np. typy niestandardowe zdefiniowane jako type MyInt int).
type Integer interface { ~int | ~int64 }
type MyInt int
// MyInt satisfies Integer because its underlying type is intgolang.org/x/exp/constraints
Pakiet constraints udostępnia typowe interfejsy ograniczeń: Ordered (obsługuje operator <), Integer, Float, Signed, Unsigned.
import "golang.org/x/exp/constraints"
func Min[T constraints.Ordered](a, b T) T {
if a < b { return a }
return b
}Pakiet cmp (Go 1.21)
W Go 1.21 do biblioteki standardowej dodano ograniczenie cmp.Ordered oraz funkcje cmp.Compare/cmp.Less, zastępując zależność exp/constraints.
import "cmp"
func Min[T cmp.Ordered](a, b T) T { return min(a, b) }Łączenie ograniczeń
W ograniczeniu można osadzić wiele interfejsów, aby wymagać spełnienia wielu właściwości:
type Printable interface {
comparable
fmt.Stringer
}Wnioskowanie ograniczeń
Kompilator wywnioskuje parametry typów na podstawie argumentów. Jeśli ograniczenie jest zbyt szerokie (any), może być konieczne jawne podanie argumentów typu, aby pokierować wnioskowaniem.
Kiedy używać comparable
Warto użyć comparable, gdy funkcja generyczna musi stosować operator == do wartości, przechowywać je jako klucze map albo używać ich jako elementów mapy lub zbioru. Nie wszystkie typy są porównywalne (slice, map i funkcje nie są).
Szybkie sprawdzenie
Co oznacza prefiks ~ w ograniczeniu sumy, takim jak ~int?
Podsumowanie: ograniczenia
Najważniejsze informacje:
- any: najszersze ograniczenie; comparable: obsługuje ==; interface: wymaga metod
- Suma (int|float64) umożliwia używanie operatorów arytmetycznych
- ~T obejmuje typy nazwane, których typem bazowym jest T
- cmp.Ordered (Go 1.21+) do ograniczeń z operatorami <, >, <=, >=
Często zadawane pytania
Czy lekcja „Ograniczenia: comparable i interfejsy” jest bezpłatna?
Tak — pełny tekst „Ograniczenia: comparable i interfejsy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Ograniczenia: comparable i interfejsy”?
Ograniczenia unii i wbudowany typ comparable Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Ograniczenia: comparable i interfejsy”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Składnia parametrów typów
- Ograniczenia: comparable i interfejsy
- Generyczne struktury danych
- Generyczność w praktyce: pułapki