Go Academy · Lektion

Struct-embedding

Sammensæt structs

Lektion 1 af 413 trin

Struct-embedding er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 1 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.

Sammensæt structer

Go har ingen klassearv. I stedet tilbyder sproget indlejring: Placér én struct i en anden uden et feltnavn for at genbruge dens felter og metoder.

Anonyme felter

Et indlejret felt erklæres kun med sin type, uden navn. Dets medlemmer promoveres til den ydre struct.

package main

import "fmt"

type Engine struct{ Power int }

type Car struct {
	Engine
	Brand string
}

func main() {
	c := Car{Engine: Engine{Power: 150}, Brand: "Coddy"}
	fmt.Println(c.Power, c.Brand)
}

Adgang til promoverede felter

Du læser direkte fra c.Power, selv om Power tilhører den indlejrede Engine. Det kaldes feltpromovering.

Den fulde sti fungerer stadig

Du kan altid tilgå den indlejrede struct eksplicit via dens typenavn.

package main

import "fmt"

type Engine struct{ Power int }
type Car struct{ Engine }

func main() {
	c := Car{Engine{200}}
	fmt.Println(c.Engine.Power)
	fmt.Println(c.Power)
}

Indlejring kontra et navngivet felt

Et navngivet felt (engine Engine) kræver c.engine.Power. Indlejring (Engine) promoverer medlemmer, så du skriver c.Power. Indlejring udtrykker et forhold af typen er en slags.

Initialisering af indlejrede structer

Brug typenavnet som feltnøgle i en sammensat literal.

package main

import "fmt"

type Address struct{ City string }
type User struct {
	Address
	Name string
}

func main() {
	u := User{Address: Address{City: "Istanbul"}, Name: "Mert"}
	fmt.Println(u.Name, "in", u.City)
}

Flere indlejringer

En struct kan indlejre flere typer og blande deres felter sammen.

package main

import "fmt"

type Timestamps struct{ Created string }
type Author struct{ Name string }
type Post struct {
	Timestamps
	Author
	Title string
}

func main() {
	p := Post{Timestamps{"today"}, Author{"Ada"}, "Hello"}
	fmt.Println(p.Title, p.Name, p.Created)
}

Navnekollisioner

Hvis to indlejrede typer har samme feltnavn, giver den tvetydige reference en kompileringsfejl — du skal kvalificere den med typenavnet for at fjerne tvetydigheden.

Skygning fra den ydre struct

Et felt, der er erklæret på den ydre struct, skygger for et promoveret felt med samme navn. Det ydre felt vinder ved ukvalificeret adgang.

package main

import "fmt"

type Base struct{ ID int }
type Item struct {
	Base
	ID int
}

func main() {
	i := Item{Base{1}, 99}
	fmt.Println(i.ID, i.Base.ID)
}

Pointerindlejring

Du kan indlejre en pointertype. Medlemmerne promoveres stadig, men du skal initialisere pointeren, ellers risikerer du en nil-dereference.

package main

import "fmt"

type Logger struct{ Prefix string }
type Service struct{ *Logger }

func main() {
	s := Service{Logger: &Logger{Prefix: "[svc]"}}
	fmt.Println(s.Prefix)
}

Hvornår skal du indlejre

  • Genbrug almindelige felter (tidsstempler, ID'er)
  • Opbyg rigere typer ud fra mindre typer
  • Undgå dyb indlejring og lange adgangsstier

Hurtig kontrol

Test din viden om structindlejring.

Opsummering

Du har lært om structindlejring.

  • Anonyme felter promoverer medlemmer til den ydre struct
  • Tilgå dem via c.Power eller c.Engine.Power
  • Ydre felter skygger for promoverede felter
  • Kollisioner kræver eksplicit kvalificering
  • Pointerindlejring fungerer også
Gratis at komme i gang

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 “Struct-embedding” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Struct-embedding”, 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 “Struct-embedding”?

Sammensæt structs 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 1 af 4.

Hvor lang tid tager lektionen “Struct-embedding”?

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

  1. Struct-embedding
  2. Interface-embedding
  3. Metodepromovering
  4. Komposition frem for nedarvning
← Tilbage til Go Academy