Back to Blog

Embedding - Composition Over Inheritance | Learn Golang #18

Sandy LaneSandy Lane

Video: Embedding - Composition Over Inheritance | Learn Golang #18 by Taught by Celeste AI - AI Coding Coach

Watch full page →

Embedding - Composition Over Inheritance in Go

In Go, struct embedding allows you to compose types by including one struct within another, promoting its fields and methods directly on the outer struct. This approach enables code reuse and flexible design without traditional inheritance, embracing composition as the preferred pattern.

Code

package main

import "fmt"

// Base struct with fields and methods
type Animal struct {
  Name string
}

func (a Animal) Speak() {
  fmt.Println(a.Name, "makes a sound")
}

// Embedding Animal inside Dog
type Dog struct {
  Animal        // Embedded struct; its fields and methods are promoted
  Breed string
}

// Override Speak method for Dog
func (d Dog) Speak() {
  fmt.Println(d.Name, "barks")
}

func main() {
  d := Dog{
    Animal: Animal{Name: "Buddy"},
    Breed:  "Golden Retriever",
  }

  // Access embedded field directly
  fmt.Println("Dog's name:", d.Name)

  // Call overridden method
  d.Speak()         // Output: Buddy barks

  // Call embedded method explicitly
  d.Animal.Speak()  // Output: Buddy makes a sound
}

Key Points

  • Embedding a struct promotes its fields and methods, making them accessible directly on the outer struct.
  • Go uses composition over inheritance, favoring embedding to reuse code and extend behavior.
  • Methods can be overridden by defining a method with the same name on the embedding struct.
  • Multiple and nested embedding allow flexible and modular type composition.
  • Interfaces can also be embedded in structs, enabling polymorphic behavior with composition.