- Go 언어에는 class 개념은 없음
- 하지만 메소드 타입은 정의할 수 있다.
receiver
인자가 있는 함수로 메서드 추가가 가능하다.
func (receiver인자 타입) 함수명() 반환값
형태로 만듬
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
}
- 리시버는 꼭 구조체 일 필요는 없다. 일반 변수도 가능 (float, int등)
package main
import (
"fmt"
"math"
)
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
func main() {
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
}
포인트 리시버
- 포인터 리시버로 메소드 선언 가능하다.
- 포인터 리시버로 선언해야 메소드로 내부 값 변경을 할 수있다.
- 포인터 리시버가 아닌 경우 생성 값으로 동작한다.
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
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}
fmt.Println(v)
v.Scale(10)
fmt.Println(v)
fmt.Println(v.Abs()) // 결과 50
// 리시버를 포인터로 선언하지 않으면 Scale 메서드 실행 후에도 v 는 3,4임
}

