Here is an example of composite design pattern. Notice the Employee structure has a list of subordinates, which is the basis of Employee itself.
package main
import (
"fmt"
)
type Employee struct {
name string
subordinate []*Employee
salary uint64
}
func newEmployee(name string, salary uint64) *Employee {
return &Employee{
name: name,
subordinate: []*Employee{},
salary: salary,
}
}
func main() {
dev1 := newEmployee("Conor Lex", 600000)
dev2 := newEmployee("Luke Lex", 600000)
manager := newEmployee("Sarah Ting", 1200000)
manager.subordinate = append(manager.subordinate, dev1)
manager.subordinate = append(manager.subordinate, dev2)
ceo := newEmployee("John Smith", 1800000)
fmt.Printf("CEO: %v\n", ceo)
fmt.Printf("Manager: %v\n", manager)
fmt.Printf("Dev 1: %v\n", dev1)
fmt.Printf("Dev 2: %v\n", dev2)
}