Go Receiver Methods Calling Syntax: A Deeper Dive
"Effective Go" 가이드에는 포인터 메서드만 사용할 수 있다고 명시되어 있습니다. 포인터에서 호출되는 반면, 값 메서드는 포인터나 값에서 호출될 수 있습니다. 그러나 최근의 만남은 다음과 같은 질문을 제기합니다. 값이 다음 코드에서 포인터 메서드를 호출하는 이유는 무엇입니까?
<code class="go">package main import ( "fmt" ) type age int func (a age) String() string { return fmt.Sprintf("%d yeasr(s) old", int(a)) } func (a *age) Set(newAge int) { if newAge >= 0 { *a = age(newAge) } } func main() { var vAge age = 5 pAge := new(age) vAge.Set(10) // Compilation successful }</code>
이 문제를 해결하기 위해 Go 언어 사양을 참조합니다. "호출" 아래에는 다음과 같이 나와 있습니다.
x의 메서드 세트(유형)에 m이 포함되어 있고 인수 목록이 m의 매개 변수 목록에 할당될 수 있는 경우 메서드 호출 x.m()이 유효합니다. x가 주소 지정 가능하고 &x의 메소드 세트에 m이 포함된 경우 x.m()은 (&x).m()의 약어입니다.
이 경우 vAge는 주소 지정이 가능합니다(*age로의 유형 변환이 유효함). vAge.Set(10)은 본질적으로 (&vAge).Set(10)입니다. Set()의 수신자 유형이 포인터이기 때문에 vAge 값이 포인터 메서드 Set()을 호출할 수 있는 이유입니다.
위 내용은 ## Go에서 값이 포인터 메서드를 호출할 수 있는 이유는 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!