package main import "fmt" type Employee struct { Id int FirstName string LastName string } type Developer struct { Individual Employee HourlyRate int WorkWeek [7]int } type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday ) func main() { d := Developer{Individual: Employee{Id: 1, FirstName: "Tony", LastName: "Stark"}, HourlyRate: 10} x := nonLoggedHours() fmt.Println("Tracking hours worked so far today:", x(2)) fmt.Println("Tracking hours worked so far today:", x(3)) fmt.Println("Tracking hours worked so far today:", x(5)) d.LogHours(Monday, 8) d.LogHours(Tuesday, 10) d.LogHours(Wednesday, 10) d.LogHours(Thursday, 10) d.LogHours(Friday, 6) d.LogHours(Saturday, 8) d.PayDetails() } func (d *Developer) LogHours(day Weekday, hours int) { d.WorkWeek[day] = hours } func (d *Developer) HoursWorked() int { total := 0 for _, v := range d.WorkWeek { total += v } return total } func (d *Developer) PayDay() (int, bool) { if d.HoursWorked() > 40 { hoursOver := d.HoursWorked() - 40 overTime := hoursOver * 2 * d.HourlyRate regularPay := 40 * d.HourlyRate return regularPay + overTime, true } return d.HoursWorked() * d.HourlyRate, false } func nonLoggedHours() func(int) int { total := 0 return func(i int) int { total += i return total } } func (d *Developer) PayDetails() { for i, v := range d.WorkWeek { switch i { case 0: fmt.Println("Sunday hours:", v) case 1: fmt.Println("Monday hours:", v) case 2: fmt.Println("Tuesday hours:", v) case 3: fmt.Println("Wednesday hours:", v) case 4: fmt.Println("Thursday hours:", v) case 5: fmt.Println("Friday hours:", v) case 6: fmt.Println("Saturday hours:", v) } } fmt.Println("Hours worked this week:", d.HoursWorked()) pay, over := d.PayDay() fmt.Println("Pay for the week:", pay) fmt.Println("Is this overtime pay:", over) }