0Pricing
Go Academy · Lekcja

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 int

golang.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

  1. Składnia parametrów typów
  2. Ograniczenia: comparable i interfejsy
  3. Generyczne struktury danych
  4. Generyczność w praktyce: pułapki
← Powrót do Go Academy