포인터가 아닌 유형의 포인터 메서드
이전 질문에 대한 응답에서는 포인터 메서드가 포인터에서만 호출될 수 있다고 명시되어 있습니다. 그러나 이는 포인터가 아닌 값에서 포인터 메서드를 성공적으로 호출하는 다음 코드에서 알 수 있듯이 잘못된 것 같습니다.
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() fmt.Println("Wheels:", c.wheels) }
설명
The 이 동작을 이해하는 열쇠는 메소드 수신자가 포인터라는 사실에 있습니다. c.fourWheels()를 호출할 때 수신자 값 c는 포인터가 아닙니다. 그러나 수신자 유형이 포인터이므로 이는 (&c).fourWheels()의 약칭으로 해석됩니다.
Go 사양에 따르면 메서드를 호출할 때 수신자 값이 주소 지정 가능하고 수신자 유형이 포인터인 경우 메서드 호출은 포인터 메서드 호출로 해석됩니다. 우리의 경우 수신자 값 c는 주소 지정이 가능하고 수신자 유형 *car는 포인터이므로 c.fourWheels() 메서드 호출은 효과적으로 (&c).fourWheels()를 호출합니다.
이 동작은 다음과 같습니다. 값 메서드는 포인터와 값에 대해 호출할 수 있는 반면 포인터 메서드는 포인터에서만 호출할 수 있다는 설명과 일치합니다. 포인터 메소드의 경우 수신자 값이 포인터가 아닌 경우, 수신자로 사용할 수 있는 포인터 값을 얻기 위해서는 역참조를 해야 합니다.
위 내용은 Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!