123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package main
- import (
- "fmt"
- "time"
- )
- type Employee struct {
- ID int
- FirstName string
- LastName string
- DateHired time.Time
- }
- type Manager struct {
- Employee
- Reports []int
- }
- type SimpleEmployeeData struct {
- employees map[int]Employee
- managers map[int]Manager
- nextID int
- }
- func NewSimpleEmployeeData() *SimpleEmployeeData {
- return &SimpleEmployeeData{
- employees: map[int]Employee{},
- managers: map[int]Manager{},
- nextID: 0,
- }
- }
- func (ed *SimpleEmployeeData) AddEmployee(firstName, lastName string, dateHired time.Time) int {
- ed.nextID++
- ed.employees[ed.nextID] = Employee{
- ID: ed.nextID,
- FirstName: firstName,
- LastName: lastName,
- DateHired: dateHired,
- }
- return ed.nextID
- }
- func (ed SimpleEmployeeData) GetEmployee(id int) (Employee, bool) {
- p, ok := ed.employees[id]
- return p, ok
- }
- func (ed *SimpleEmployeeData) AddManager(firstName, lastName string, dateHired time.Time, reports []int) int {
- ed.nextID++
- ed.managers[ed.nextID] = Manager{
- Employee: Employee{
- ID: ed.nextID,
- FirstName: firstName,
- LastName: lastName,
- DateHired: dateHired,
- },
- Reports: reports,
- }
- return ed.nextID
- }
- func (ed SimpleEmployeeData) GetManager(id int) (Manager, bool) {
- m, ok := ed.managers[id]
- return m, ok
- }
- func DMYToTime(day int, month time.Month, year int) time.Time {
- return time.Date(year, month, day, 0, 0, 0, 0, time.UTC)
- }
- func main() {
- ed := NewSimpleEmployeeData()
- manageEmployees(ed)
- }
- func manageEmployees(ed EmployeeData) {
- e1ID := ed.AddEmployee("Bob", "Bobson", DMYToTime(10, time.January, 2020))
- e2ID := ed.AddEmployee("Mary", "Maryson", DMYToTime(30, time.March, 2007))
- e1, exists1 := ed.GetEmployee(e1ID)
- e2, exists2 := ed.GetEmployee(e2ID)
- fmt.Println(e1, exists1)
- fmt.Println(e2, exists2)
- e3, exists3 := ed.GetEmployee(2000)
- fmt.Println(e3, exists3)
- m1ID := ed.AddManager("Boss", "BossPerson", DMYToTime(17, time.June, 1982), []int{e1ID, e2ID})
- m1, _ := ed.GetManager(m1ID)
- fmt.Println(m1.FirstName, m1.Reports)
- var e4 = m1.Employee
- fmt.Println(e4.LastName)
- fmt.Println(FormatTenure(e1))
- fmt.Println(FormatTenure(e2))
- fmt.Println(m1.TimeAtCompany())
- fmt.Println(FormatTenure(m1))
- fmt.Println(m1)
- }
- type Dater interface {
- TimeAtCompany() time.Duration
- }
- func FormatTenure(d Dater) string {
- // convert from hours to years and days (ignoring leap years)
- hours := int(d.TimeAtCompany().Hours())
- years := hours / (24 * 365)
- hours = hours % (24 * 365)
- days := hours / 24
- return fmt.Sprintf("%d years, %d days", years, days)
- }
- func (e Employee) TimeAtCompany() time.Duration {
- return time.Since(e.DateHired)
- }
- func (e Employee) String() string {
- return e.FirstName + " " + e.LastName + ": Tenure " + FormatTenure(e)
- }
- func (m Manager) String() string {
- return fmt.Sprintf("%s, reports: %v", m.Employee, m.Reports)
- }
- type EmployeeData interface {
- AddEmployee(firstName, lastName string, dateHired time.Time) int
- GetEmployee(id int) (Employee, bool)
- AddManager(firstName, lastName string, dateHired time.Time, reports []int) int
- GetManager(id int) (Manager, bool)
- }
|