Back
Syntax
Study
Editor
Mode:
HTML
CSS
JavaScript
PHP
Reset
Run »
HTML / CSS / JS
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 ", 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() }
Result
Open