W Go embedding (oczytanie) to mechanizm, który pozwala na "dziedziczenie" zachowania struktury przez wbudowanie jednej struktury w drugą bez użycia jawnego dziedziczenia, jak ma to miejsce w OOP. Wbudowana struktura staje się polami-wbudowanymi (anonimowymi polami) nowej struktury.
Wszystkie metody wbudowanej struktury stają się metodami nowej struktury, jakby były "dziedziczone".
Przykład:
package main import "fmt" type Animal struct { Name string } func (a Animal) Speak() { fmt.Println("Moje imię to", a.Name) } type Dog struct { Animal // zagnieżdżenie, pole anonimowe Breed string } func main() { d := Dog{ Animal: Animal{Name: "Rex"}, Breed: "Shepherd", } d.Speak() // Metoda dziedziczona! fmt.Println(d.Name) // Pole dostępne bezpośrednio }
Główna różnica między embedding a zwykłym uwzględnieniem struktury jako pola nazwanym:
"Jeśli wbudowana struktura i zewnętrzna zawierają pola o tych samych nazwach, które będzie używane i jak do nich się odwołać?"
Wielu sądzi, że użyte tylko "wyższe" pole, ale to działa inaczej:
Przykład:
type Base struct { Name string } type Child struct { Base // zagnieżdżenie Name string // zgadzające się pole } c := Child{Base: Base{Name: "Base"}, Name: "Child"} fmt.Println(c.Name) // Child fmt.Println(c.Base.Name) // Base
Historia
W projekcie wbudowano standardową strukturę do logowania, a następnie określono pole
Loggerw typie potomnym. W rezultacie, wywołaniad.Logger.Info()działały nie tak, jak oczekiwano, ponieważ dostęp do wbudowanego pola "ginął" wśród jednoimiennych.
Historia
Programista próbował nadpisać metodę w strukturze potomnej, ale metody nie "przeciążają się" — po prostu pojawia się nowa, a metoda rodzicielska wciąż jest dostępna jako
Child.Base.Method(). Prowadziło to do tego, że część kodu używała "starej" wersji metody, oczekując innej logiki.
Historia
Przy serializacji JSON z zagnieżdżonymi strukturami występowały niespodzianki: pola "wbudowanej" struktury pojawiały się w obiekcie głównym. Z powodu braku wiedzy o tym, jak embedding wpływa na marshaling, struktura była serializowana niepoprawnie, łamiąc wsteczną zgodność API.