Go는 클래스를 가지지 않습니다.
하지만, 그와 같은 타입의 메소드를 정의할 수 있습니다.
그 메서드는 특별한 receiver 인자가 있는 함수입니다.
그 receiver는 func 키워드와 메서드 이름 사이의 자체 인수 목록에 나타납니다.
Go를 향한 여행
😎코드로 확인하기!
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
// 여기서 리시버는 (v Vertex)이고 값 리시버를 사용합니다
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Abs())
// Scale함수의 인자가 포인터 리시버(v *Vertex)인 경우 50
// Scale함수의 인자가 값 리시버(v Vertex)인 경우 5
}
Read Only로 관리할 수 있습니다.
== 새로운 변수를 생성해서 기존 값(Vertex)을 수정하지 않습니다.
해당 인스턴스 값을 변경할 수 있습니다.
== 기존 값(Vertex)에 접근해서 수정합니다.
포인터 리시버를 사용하면 큰 구조체나 데이터의 값복사를 방지해서 메모리를 효율적으로 관리할 수 있는 장점이 있습니다!