-
-
Save santosh/ab2228279e0924b4142befa85aa59a50 to your computer and use it in GitHub Desktop.
package main | |
import "fmt" | |
type SalaryCalculator interface { | |
CalculateSalary() int | |
} | |
type Permanent struct { | |
empId int | |
basicpay int | |
pf int | |
} | |
type Contract struct { | |
empId int | |
basicpay int | |
} | |
type Freelancer struct { | |
empId int | |
ratePerHour int | |
totalHours int | |
} | |
// salary of permanent employee is the sum of basi pay and pf | |
func (p Permanent) CalculateSalary() int { | |
return p.basicpay + p.pf | |
} | |
// salary of contract employee is the basic pay alone | |
func (c Contract) CalculateSalary() int { | |
return c.basicpay | |
} | |
// salary of freelancer | |
func (f Freelancer) CalculateSalary() int { | |
return f.ratePerHour * f.totalHours | |
} | |
/* | |
total expense is calculated by iterating through the SalaryCalculator | |
slice and summing the salaries of the individual employees | |
*/ | |
func totalExpense(s []SalaryCalculator) { | |
expense := 0 | |
for _, v := range s { | |
expense = expense + v.CalculateSalary() | |
} | |
fmt.Printf("Total Expense Per Month $%d", expense) | |
} | |
func main() { | |
pemp1 := Permanent{ | |
empId: 1, | |
basicpay: 5000, | |
pf: 20, | |
} | |
pemp2 := Permanent{ | |
empId: 2, | |
basicpay: 6000, | |
pf: 30, | |
} | |
cemp1 := Contract{ | |
empId: 3, | |
basicpay: 3000, | |
} | |
freelancer1 := Freelancer{ | |
empId: 4, | |
ratePerHour: 70, | |
totalHours: 120, | |
} | |
freelancer2 := Freelancer{ | |
empId: 5, | |
ratePerHour: 100, | |
totalHours: 100, | |
} | |
employees := []SalaryCalculator{pemp1, pemp2, cemp1, freelancer1, freelancer2} | |
totalExpense(employees) | |
} |
Edit 1
an interface is a set of method signatures. When a type provides a definition for all the methods in the interface, it is said to implement the interface. It is much similar to the OOP world. An interface specifies what methods a type should have and the type decides how to implement these methods.
For example, WashingMachine can be an interface with method signatures Cleaning()
and Drying()
. Any type which provides a definition for Cleaning()
and Drying()
methods is said to implement the WashingMachine interface.
Edit 2
Practical use of interface. The biggest advantage of this is that totalExpense
can be extended to any new employee type without any code changes. Let's say the company adds a new type of employee Freelancer with a different salary structure. This Freelancer can just be passed in the slice argument to totalExpense
without even a single line of code change to the totalExpense
function. This method will do what it's supposed to do as Freelancer will also implement the SalaryCalculator interface :).
Edit 0
Very basic demo.