Go
Beginner
1 min read
Struct Embedding and Composition
Example
package main
import "fmt"
// Base type
type Animal struct {
Name string
}
func (a Animal) Speak() string {
return a.Name + " makes a sound."
}
func (a Animal) Describe() string {
return fmt.Sprintf("I am %s", a.Name)
}
// Dog embeds Animal
type Dog struct {
Animal // anonymous (embedded) field
Breed string
}
// Dog overrides Speak
func (d Dog) Speak() string {
return d.Name + " says: Woof!"
}
// Logger shows embedding for cross-cutting concerns
type Logger struct {
Prefix string
}
func (l Logger) Log(msg string) {
fmt.Printf("[%s] %s\n", l.Prefix, msg)
}
type Service struct {
Logger // embedded logger
Name string
}
func (s *Service) Start() {
s.Log("starting service: " + s.Name) // promoted method
}
func main() {
d := Dog{
Animal: Animal{Name: "Rex"},
Breed: "Labrador",
}
fmt.Println(d.Speak()) // Dog's own method
fmt.Println(d.Describe()) // promoted from Animal
fmt.Println(d.Name) // promoted field
svc := Service{
Logger: Logger{Prefix: "INFO"},
Name: "AuthService",
}
svc.Start()
}