포인터가 아닌 유형에 대한 포인터 메서드 설명
Go에서 규칙에 따르면 값 메서드는 포인터와 값 모두에서 호출될 수 있습니다. 포인터 메서드는 포인터로 제한됩니다. 그러나 이 규칙의 명백한 예외는 포인터가 아닌 값에서 포인터 메서드를 실행하는 기능입니다.
다음 코드 조각을 고려하세요.
package main import "fmt" type car struct { wheels int } func (c *car) fourWheels() { c.wheels = 4 } func main() { var c = car{} fmt.Println("Wheels:", c.wheels) c.fourWheels() // Here, a pointer method is invoked on a non-pointer value fmt.Println("Wheels:", c.wheels) }
코드는 포인터 메서드 fourWheels를 성공적으로 실행합니다. 포인터가 아닌 값에 대해 c. 이는 확립된 규칙과 모순되는 것처럼 보일 수 있습니다.
실제로 포인터가 아닌 값 c에 대해 fourWheels 메소드를 호출할 때 약식 표기법을 사용하고 있습니다. c.fourWheels() 표현식은 (&c).fourWheels()와 동일합니다.
Go 사양에 따르면 "x가 주소 지정 가능하고 &x의 메서드 세트에 m이 포함되어 있으면 x.m()은 ( &x).m()."
즉, Go는 포인터가 아닌 값 c를 암시적으로 역참조하여 포인터를 얻습니다. 이는 포인터 메서드의 수신자로 사용됩니다.
포인터 메서드에 대한 규칙을 명확히 하려면 다음과 같이 해석해야 합니다.
위 내용은 Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!