Golang 2 - Interfaces - Nâng cao
    Written on January  2, 2024
  
  Pointer receivers and value receivers
Ngoài implement interface bằng value receiver như trong bài 1, chúng ta có thể implemeent bằng pointer receivers. Cho ví dụ sau:
Implementing multiple interface
Một type có thể implemt nhiều hơn một interface.
package main
import (
	"fmt"
)
type SalaryCalculator interface {
	DisplaySalary()
}
type LeaveCalculator interface {
	CalculateLeavesLeft() int
}
type Employee struct {
	firstName string
	lastName string
	basicPay int
	pf int
	totalLeaves int
	leavesTaken int
}
func (e Employee) DisplaySalary() {
	fmt.Printf("%s %s has salary $%d", e.firstName, e.lastName, (e.basicPay + e.pf))
}
func (e Employee) CalculateLeavesLeft() int {
	return e.totalLeaves - e.leavesTaken
}
func main() {
	e := Employee {
		firstName: "Naveen",
		lastName: "Ramanathan",
		basicPay: 5000,
		pf: 200,
		totalLeaves: 30,
		leavesTaken: 5,
	}
	var s SalaryCalculator = e
	s.DisplaySalary()
	var l LeaveCalculator = e
	fmt.Println("\nLeaves left =", l.CalculateLeavesLeft())
}
Embedding interface
Mặc dù Go không có cung cấp công cụ kế thừa, chúng ta vẫn có thể tạo ra một interface bằng cách embedding interface khác. Ví dụ
package main
import (  
    "fmt"
)
type SalaryCalculator interface {  
    DisplaySalary()
}
type LeaveCalculator interface {  
    CalculateLeavesLeft() int
}
type EmployeeOperations interface {
	SalaryCalculator
	LeaveCalculator
}
type Employee struct {  
    firstName string
    lastName string
    basicPay int
    pf int
    totalLeaves int
    leavesTaken int
}
func (e Employee) DisplaySalary() {  
    fmt.Printf("%s %s has salary $%d", e.firstName, e.lastName, (e.basicPay + e.pf))
}
func (e Employee) CalculateLeavesLeft() int {  
    return e.totalLeaves - e.leavesTaken
}
func main() {  
    e := Employee {
        firstName: "Naveen",
        lastName: "Ramanathan",
        basicPay: 5000,
        pf: 200,
        totalLeaves: 30,
        leavesTaken: 5,
    }
    var empOp EmployeeOperations = e
    empOp.DisplaySalary()
    fmt.Println("\nLeaves left =", empOp.CalculateLeavesLeft())
}
