type countable interface { HoursWorked() time.Duration } type WorkDay struct { StartTime time.Time EndTime time.Time } type WorkWeek struct { WorkDays []WorkDay } type WorkMonth struct { WorkWeeks []WorkWeek } func (w WorkDay) HoursWorked() time.Duration { // Find hours worked through simple subtraction. } func (w WorkWeek) HoursWorked() time.Duration { return sumHoursWorked(w.WorkDays) } func (w WorkMonth) HoursWorked() time.Duration { return sumHoursWorked(w.WorkWeeks) } func sumHoursWorked(timeFrames []countable) time.Duration { var totalHours time.Duration for i := range timeFrames { totalHours += timeFrames[i].HoursWorked() } return totalHours }