Last active
July 7, 2020 19:33
-
-
Save santosh/ab2228279e0924b4142befa85aa59a50 to your computer and use it in GitHub Desktop.
Getting started with interfaces.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 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 :).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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()
andDrying()
. Any type which provides a definition forCleaning()
andDrying()
methods is said to implement the WashingMachine interface.