Go by Example: 메서드

Go는 구조체 타입에 정의할 수 있는 methods를 지원합니다.

package main
import "fmt"
type rect struct {
	width, height int
}

area 메서드는 *rect리시버 타입(receiver type)으로 갖습니다.

func (r *rect) area() int {
	return r.width * r.height
}

메서드는 포인터 또는 값을 리시버 타입으로하여 정의될 수 있습니다. 여기에 값을 리시버로 하는 예시가 있습니다.

func (r rect) perim() int {
	return 2*r.width + 2*r.height
}
func main() {
	r := rect{width: 10, height: 5}

구조체에 정의된 두 개의 메서드를 호출했습니다.

	fmt.Println("area: ", r.area())
	fmt.Println("perim:", r.perim())

Go는 메서드 호출에 대해 값과 포인터간의 변환을 자동으로 처리합니다. 메서드 호출시 값 복사를 피하기 위해 포인터 리시버 타입을 사용할 수도 있고 전달되는 구조체를 변경할 수 있도록 할 수도 있습니다.

	rp := &r
	fmt.Println("area: ", rp.area())
	fmt.Println("perim:", rp.perim())
}
$ go run methods.go 
area:  50
perim: 30
area:  50
perim: 30

다음 장에선 Go에서 관련있는 메서드들을 그룹핑하고 네이밍 하기위한 메커니즘을 살펴봅시다: 인터페이스 (interfaces).

다음 예제: 인터페이스.