Metodepromovering
Nedarv metoder via embedding
Metodepromovering er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 3 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.
Nedarv metoder via indlejring
Når du indlejrer en type, promoveres dens metoder også. Den ydre type kan kalde dem, som om den selv havde defineret dem — Gos variant af arv.
En promoveret metode
Car indlejrer Engine og får dens Start-metode uden ekstra arbejde.
package main
import "fmt"
type Engine struct{}
func (Engine) Start() { fmt.Println("engine started") }
type Car struct{ Engine }
func main() {
c := Car{}
c.Start()
}Metoder arbejder på den indlejrede værdi
En promoveret metode køres på det indlejrede felt, ikke på den ydre struct. Den kan ikke se den ydre structs øvrige felter.
package main
import "fmt"
type Counter struct{ n int }
func (c *Counter) Inc() { c.n++ }
func (c Counter) Get() int { return c.n }
type Widget struct{ Counter }
func main() {
w := Widget{}
w.Inc()
w.Inc()
fmt.Println(w.Get())
}Tilsidesættelse af en metode
Definér en metode med samme navn på den ydre struct for at tilsidesætte den promoverede metode. Den ydre metode har forrang.
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "..." }
type Dog struct{ Animal }
func (Dog) Speak() string { return "Woof" }
func main() {
fmt.Println(Dog{}.Speak())
}Kald af den indlejrede version
Selv efter en tilsidesættelse kan du stadig tilgå den oprindelige metode via den indlejrede types navn.
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "generic" }
type Dog struct{ Animal }
func (d Dog) Speak() string { return "Woof + " + d.Animal.Speak() }
func main() {
fmt.Println(Dog{}.Speak())
}Promovering og grænseflader
Fordi promoverede metoder er en del af den ydre types metodesæt, kan den ydre type opfylde grænseflader ved hjælp af den indlejrede types metoder.
package main
import "fmt"
type Stringer interface{ String() string }
type Base struct{ name string }
func (b Base) String() string { return b.name }
type Wrapper struct{ Base }
func main() {
var s Stringer = Wrapper{Base{"hi"}}
fmt.Println(s.String())
}Metodesæt for pointere kontra værdier
Hvis den indlejrede type har metoder med pointermodtager, er det kun en pointer til den ydre struct (eller en adresserbar værdi), der får disse metoder promoveret til sit metodesæt.
Indlejring til standardfunktionalitet
Indlejr en type, der leverer fornuftige standardmetoder, og tilsidesæt derefter kun de få, du skal tilpasse — et effektivt mønster til genbrug.
package main
import "fmt"
type DefaultHandler struct{}
func (DefaultHandler) Handle() string { return "default" }
type CustomHandler struct{ DefaultHandler }
func (CustomHandler) Handle() string { return "custom" }
func main() {
fmt.Println(CustomHandler{}.Handle())
}Ingen ægte polymorfi
I modsætning til klassisk OOP kalder den indlejrede metode ikke den ydre tilsidesættelse igen. Go har ingen virtuel metodeudvælgelse via indlejring.
Promovering gennem flere niveauer
Metoder promoveres transitivt: Hvis A indlejrer B, og B indlejrer C, får A også C's metoder, så længe der ikke er tvetydighed.
Hvornår promovering hjælper
- Genbrug funktionalitet uden at skrive den om
- Tilbyd standardfunktionalitet, som du kan tilsidesætte
- Opfyld grænseflader via indlejrede metoder
Hurtig kontrol
Test din viden om metodepromovering.
Opsummering
Du har lært om metodepromovering.
- Indlejrede metoder promoveres til den ydre type
- Ydre metoder tilsidesætter promoverede metoder
- Tilgå den oprindelige metode via den indlejrede types navn
- Promovering hjælper med at opfylde grænseflader, men der er ingen virtuel udvælgelse
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 “Metodepromovering” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Metodepromovering”, 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 “Metodepromovering”?
Nedarv metoder via embedding 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 3 af 4.
Hvor lang tid tager lektionen “Metodepromovering”?
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
- Struct-embedding
- Interface-embedding
- Metodepromovering
- Komposition frem for nedarvning