객체 대 포인터 수신기를 사용한 메서드 호출
Go에서는 값 수신기(비포인터) 또는 포인터가 있는 유형에 대해 메서드를 정의할 수 있습니다. 수신기(포인터). 객체가 포인터 수신기를 사용하여 메서드를 호출하면 Go는 호출이 객체에 대한 포인터에서 이루어진 것처럼 자동으로 해석합니다.
예를 들어 다음 코드를 고려하세요.
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} v.Scale(10) // Calling a method with a pointer receiver using an object fmt.Println(v.Abs()) }
여기에는 값 및 포인터 수신 방법이 모두 포함된 Vertex 유형이 있습니다. 기본 함수에서는 Vertex 객체 v를 생성한 다음 해당 객체에 대해 Scale 메서드를 호출합니다. 일반적으로 Scale 메서드는 포인터 수신기를 기대하지만 이 경우에는 개체를 사용하고 있습니다.
컴파일러는 v가 주소 지정 가능하고 해당 메서드 세트에 Scale이 포함되어 있음을 확인합니다. Go 사양에 따르면:
"x의 메소드 세트(유형)에 m이 포함되고 인수 목록이 m의 매개변수 목록에 할당될 수 있는 경우 x.m() 메소드 호출이 유효합니다. x 주소 지정이 가능하고 &x의 메서드 세트에 m이 포함되어 있습니다. x.m()은 (&x).m()의 약어입니다."
따라서 v.Scale(10) 호출이 해석됩니다. (&v).Scale(10)과 같이 v 개체에 대한 포인터를 Scale 메서드에 효과적으로 전달합니다. 이를 통해 메서드가 개체의 X 및 Y 필드를 예상대로 수정할 수 있습니다.
위 내용은 메소드에 포인터 수신기가 있는 경우 Go는 객체 수신기와의 메소드 호출을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!