Go Academy · Lektion

Anonyme structs og komposition

Embedding og genbrug af struct-baseret kode

Lektion 4 af 413 trin

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 en Animal
  • 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.

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 “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

  1. Definering og brug af structs
  2. Metoder på structs
  3. Konstruktørmønstre
  4. Anonyme structs og komposition
← Tilbage til Go Academy