Anonyme structs og komposition
Embedding og genbrug af struct-baseret kode
Anonyme structs og komposition er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 4 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.
Anonyme structs
En anonym struct har ingen navngiven type. Den defineres direkte på stedet og er nyttig til kortvarige data, tabeldrevne test og engangsgrupperinger:
package main
import "fmt"
func main() {
point := struct{ X, Y int }{X: 3, Y: 7}
fmt.Println(point.X, point.Y)
}Anonyme structs i tabeltest
Et almindeligt Go-idiom bruger en slice med anonyme structs til tabeldrevne test:
package main
import "fmt"
func double(n int) int { return n * 2 }
func main() {
tests := []struct{ input, want int }{
{1, 2}, {5, 10}, {0, 0},
}
for _, tt := range tests {
got := double(tt.input)
if got != tt.want {
fmt.Printf("FAIL: double(%d) = %d, want %d\n", tt.input, got, tt.want)
}
}
fmt.Println("all tests passed")
}Struct-indlejring
Når du indlejrer en type i en struct, bliver dens felter og metoder direkte tilgængelige i den ydre struct:
package main
import "fmt"
type Animal struct{ Name string }
func (a Animal) Speak() string { return a.Name + " speaks" }
type Dog struct {
Animal // embedded
Breed string
}
func main() {
d := Dog{Animal: Animal{"Rex"}, Breed: "Labrador"}
fmt.Println(d.Name) // promoted field
fmt.Println(d.Speak()) // promoted method
}Flere indlejringer
En struct kan indlejre flere typer. Konflikter (samme felt- eller metodename) skal løses eksplicit:
package main
import "fmt"
type Logger struct{}
func (Logger) Log(s string) { fmt.Println("[LOG]", s) }
type Metrics struct{}
func (Metrics) Count() int { return 42 }
type Service struct {
Logger
Metrics
Name string
}
func main() {
svc := Service{Name: "auth"}
svc.Log("started") // from Logger
fmt.Println(svc.Count()) // from Metrics
}Indlejring kontra nedarvning
Go har ingen klasse-nedarvning. Indlejring er komposition:
- Indlejring gør felter og metoder direkte tilgængelige, men den ydre type er ikke en undertype
- Du kan ikke sende en
Dog, hvor der forventes enAnimal - Brug grænseflader til polymorfi og indlejring til genbrug af kode
Tilsidesættelse af direkte tilgængelige metoder
Den ydre struct kan skjule en indlejret metode ved at definere sin egen:
package main
import "fmt"
type Base struct{}
func (Base) Hello() string { return "Base hello" }
type Child struct{ Base }
func (Child) Hello() string { return "Child hello" } // shadows Base.Hello
func main() {
c := Child{}
fmt.Println(c.Hello()) // Child hello
fmt.Println(c.Base.Hello()) // Base hello (explicit)
}Anonym struct til konfiguration
Brug en anonym struct til at gruppere relateret konfiguration uden at definere en navngiven type:
package main
import "fmt"
func main() {
cfg := struct {
Host string
Port int
TLS bool
}{
Host: "api.example.com",
Port: 443,
TLS: true,
}
fmt.Println(cfg)
}Indlejring af en grænseflade
Det er nyttigt at indlejre en grænseflade i en struct til mocking og standardimplementeringer:
package main
import "fmt"
type Reader interface{ Read() string }
type Mock struct{ Reader } // embed interface
func main() {
m := Mock{}
fmt.Printf("%T\n", m.Reader) // <nil> — not set
// Assign a real impl at test time:
_ = m
}Faldgruber ved struct-komposition
Vær opmærksom på:
- Entydige selektorer, når to indlejrede typer har samme felt- eller metodename
- En nil-indlejret pointer, der udløser en panic, når du kalder metoder på den
- At glemme, at indlejring ikke er nedarvning — du kan ikke bruge den ydre type som erstatning for den indlejrede type
Sammenligning af anonyme structs
To anonyme structs med de samme feltnavne og typer kan tildeles til hinanden, hvis deres tags også stemmer overens:
package main
import "fmt"
func main() {
a := struct{ X, Y int }{1, 2}
b := struct{ X, Y int }{1, 2}
fmt.Println(a == b) // true
}Hurtig kontrol
Hvad opnår du ved at indlejre en type i en struct?
Opsummering: Komposition
Vigtigste pointer:
- Anonyme structs er velegnede til tabeltest og kortvarige data
- Indlejring gør felter og metoder direkte tilgængelige — det er komposition, ikke nedarvning
- Ydre typer kan skjule indlejrede metoder
- Entydige selektorer skal løses eksplicit
- Brug grænseflader til polymorfi
Øvelsesopgave
Opret en TimestampedRecord-struct, der indlejrer en Timestamp struct{ CreatedAt, UpdatedAt string } og en Data struct{ Key, Value string }. Opret en instans af den, og udskriv alle direkte tilgængelige felter.
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 “Anonyme structs og komposition” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Anonyme structs og komposition”, 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 “Anonyme structs og komposition”?
Embedding og genbrug af struct-baseret kode 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 4 af 4.
Hvor lang tid tager lektionen “Anonyme structs og komposition”?
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
- Definering og brug af structs
- Metoder på structs
- Konstruktørmønstre
- Anonyme structs og komposition