메서드는 특별한 리시버 인자를 가진 함수예요.
리시버는 func 키워드와 메서드 이름 사이에 있는, 그 메서드만의 인자 목록에 나타나요.
func (receiver type) MethodName(parameters) (returnTypes) {
}
리시버의 타입이 메서드와 같은 패키지에 정의되어 있을 때만 그 리시버를 가진 메서드를 정의할 수 있어요.
type Person struct {
Name string
}
func (p Person) Greetings() string {
return fmt.Sprintf("Welcome %s!", p.Name)
}
s := Person{Name: "Bronson"}
fmt.Println(s.Greetings())
// Output: Welcome Bronson!
리시버에는 값 리시버와 포인터 리시버, 두 가지 종류가 있어요.
값 리시버를 가진 메서드는 전달받은 값의 복사본 위에서 동작해요. 그래서 메서드 안에서 리시버를 수정해도 호출한 쪽에서는 그 변경을 볼 수 없어요.
리시버가 가리키는 값을 수정하려면 포인터 리시버를 가진 메서드를 선언하면 돼요. 이런 수정은 메서드를 호출한 쪽에도 그대로 보여요.
type rect struct {
width, height int
}
func (r *rect) squareIt() {
r.height = r.width
}
r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20
r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10
여기에서 여러 예제를 볼 수 있어요. 메서드에 관한 이 짧은 튜토리얼도 확인해 봐요.
기억해 둬요. 메서드는 그냥 리시버 인자를 가진 함수일 뿐이에요.