Skip to content

Instantly share code, notes, and snippets.

@santosh
Last active July 7, 2020 19:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save santosh/ab2228279e0924b4142befa85aa59a50 to your computer and use it in GitHub Desktop.
Save santosh/ab2228279e0924b4142befa85aa59a50 to your computer and use it in GitHub Desktop.
Getting started with interfaces.
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)
}
@santosh
Copy link
Author

santosh commented Jul 7, 2020

Edit 0

Very basic demo.

@santosh
Copy link
Author

santosh commented Jul 7, 2020

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.

@santosh
Copy link
Author

santosh commented Jul 7, 2020

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