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
}