Day 5 with Go-Lang

less than 1 minute read

Go Method

타 언어의 Class 가 필드와 메소드를 내부에 함께 갖는 것과 다르게 Go 언어는 struct 내에 필드만 있고, 메소드는 별도로 분리해 정의한다.

Go 메소드는 특별한 형태의 함수이다. 메소드는 함수를 정의할 때, func 키워드와 함수명 사이에 어떤 Struct 를 위한 메소드인지 를 명시하게 된다. 흔히 Receiver 로 불리우는 이 부분은 메소드가 속한 Struct 의 Type 과 변수명을 지정하는데, Struct 의 변수명은 함수 내에서 입력 Parameter 처럼 사용된다. 메소드가 선언된 이후 해당 Struct 객체로부터 메소드를 직접 호출할 수 있다.

package main

type Rect struct {
	width, height int
}

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

func main() {
	rect := Rect{10, 20}
	area := rect.area()
	println(area)
}
  • Value vs. Pointer Receiver

Value Receiver 는 Struct 의 데이터를 복사해 전달하고, Pointer Receiver 는 Struct 의 포인터만 전달한다. Value Reciever 의 경우 메소드 내에서 Struct 의 필드값이 변경되더라도 호출자의 데이터는 변경되지 않는 반면, Pointer Receiver 는 메소드 내 필드값이 변경되면 그대로 호출자에 반영된다.

func (r *Rect) area2() int {
	r.width++
	return r.width * r.height
}

func main() {
	rect := Rect{10, 20}
	area2 := rect.area2()
	println(area2, rect.width)
}

Reference : 예제로 배우는 Go 프로그래밍