1. Receiver
// Receiver 을 이용하여 구조체의 함수 정의
func (a *account) withdrawMethod(amount int) {
a.balance -= amount
}
a.withdrawMethod(30) // 구조체 함수 호출
2. Alias Receiver
type myInt int
func (a myInt) add(b int) int {
return int(a) + b
}
// Usage
var a myInt = 10
fmt.Println(a.add(30))
o
3. Pointer receiver vs Value receiver
package main
import "fmt"
type account struct {
balance int
firstName string
lastName string
}
func (a1 *account) withdrawPointer(amount int) { // Pointer receiver
// 구조체의 주소가 복사되어, a1은 호출한 구조체의 instance을 가르킨다.
a1.balance -= amount
}
func (a2 account) withdrawValue(amount int) { // Value receiver
// 구조체의 모든 값이 복사되어 새로운 instance a2가 생긴다.
a2.balance -= amount
}
func (a3 account) withdrawReturnValue(amount int) account {
// a3라는 인스턴스를 새로만들고, 그 인스턴스를 반환한다.
a3.balance -= amount
return a3
}
func main() {
var mainA *account = &account{100, "Joe", "Park"}
mainA.withdrawPointer(30)
fmt.Println(mainA.balance) // 70
mainA.withdrawValue(20)
fmt.Println(mainA.balance) // 70
var mainB account = mainA.withdrawReturnValue(20)
fmt.Println(mainA.balance) // 50
mainB.withdrawPointer(30)
fmt.Println(mainB.balance) // 20
}