Constraints: comparable og interfaces
Union constraints og den indbyggede comparable-type
Constraints: comparable og interfaces er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.
Hvad er en typebegrænsning?
En typebegrænsning begrænser, hvilke typer der kan bruges som typeargument. Uden en begrænsning er typeparameteren any (den tomme grænseflade — understøtter kun tildeling og sammenligning via ==).
any-begrænsningen
any (alias for interface{}) er den bredeste begrænsning — alle typer opfylder den. Du kan kun bruge operationer, som alle typer understøtter: tildeling og videregivelse til grænsefladeparametre.
func Print[T any](v T) { fmt.Println(v) }comparable-begrænsningen
comparable begrænser typeparameteren til typer, der understøtter == og !=. Det er nødvendigt for at bruge typen som map-nøgle eller i lighedstjek.
func Contains[T comparable](s []T, v T) bool {
for _, item := range s {
if item == v { return true }
}
return false
}Grænsefladebegrænsninger
Brug en grænseflade som begrænsning for at kræve bestemte metoder. Typeparameteren skal have alle grænsefladens metoder.
type Stringer interface { String() string }
func Print[T Stringer](v T) {
fmt.Println(v.String())
}Foreningsbegrænsninger
Brug en forening af typer med | for at begrænse til et sæt konkrete typer. Det gør det muligt at bruge operatorer (såsom +), der ikke er en del af nogen grænseflade.
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 for underliggende typer
Brug ~T til at inkludere ikke kun T, men alle typer, der har T som underliggende type (f.eks. brugerdefinerede typer defineret som type MyInt int).
type Integer interface { ~int | ~int64 }
type MyInt int
// MyInt satisfies Integer because its underlying type is intgolang.org/x/exp/constraints
Pakken constraints indeholder almindelige grænseflader til typebegrænsninger: Ordered (understøtter <), 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
}cmp-pakken (Go 1.21)
Go 1.21 tilføjede typebegrænsningen cmp.Ordered samt funktionerne cmp.Compare/cmp.Less i standardbiblioteket, så afhængigheden af exp/constraints ikke længere er nødvendig.
import "cmp"
func Min[T cmp.Ordered](a, b T) T { return min(a, b) }Kombination af typebegrænsninger
Indlejr flere grænseflader i en typebegrænsning for at kræve flere egenskaber:
type Printable interface {
comparable
fmt.Stringer
}Inferens af typebegrænsninger
Compileren udleder typeparametre fra argumenterne. Hvis typebegrænsningen er for bred (any), kan det være nødvendigt at angive typeargumenterne eksplicit for at styre inferensen.
Hvornår skal comparable bruges
Brug comparable, når den generiske funktion skal bruge == på værdier, gemme dem i maps som nøgler eller bruge dem som elementer i maps eller mængder. Ikke alle typer kan sammenlignes (slices, maps og funcs kan ikke).
Hurtigt tjek
Hvad betyder præfikset ~ i en unionstypebegrænsning som ~int?
Opsummering: Typebegrænsninger
Vigtige punkter:
any: bredest;comparable: understøtter ==;interface: kræver metoder- Unionen
(int|float64)muliggør aritmetiske operatorer ~Tinkluderer navngivne typer med T som underliggende typecmp.Ordered(Go 1.21+) til begrænsninger med <, >, <=, >=
Lær Go med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Constraints: comparable og interfaces” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Constraints: comparable og interfaces”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Constraints: comparable og interfaces”?
Union constraints og den indbyggede comparable-type Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Go Academy?
Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Constraints: comparable og interfaces”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Go Academy-lektion?
Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Syntaks for typeparametre
- Constraints: comparable og interfaces
- Generiske datastrukturer
- Generics i praksis: Faldgruber