Go 메소드 세트: 포인터 유형 및 수신자를 위한 메소드 호출
Go 메소드 세트에서 자주 논의되는 측면 중 하나는 호출을 시도할 때 발생합니다. T 유형의 변수에 대한 수신자 유형 T를 갖는 메소드. Go 사양에서는 T의 메소드 세트에 다음이 포함된다고 명시되어 있습니다. 수신기 유형이 *T인 방법과 수신기 유형이 T인 방법 모두.
충돌하는 추론
그러나 다음 예는 이 추론이 반직관적으로 보일 수 있음을 보여줍니다.
package main import ( "fmt" "reflect" ) type User struct{} func (self *User) SayWat() { fmt.Println(self) fmt.Println(reflect.TypeOf(self)) fmt.Println("WAT\n") } func main() { var user User = User{} fmt.Println(reflect.TypeOf(user), "\n") user.SayWat() }
컴파일러 추론
컴파일러는 user.SayWat() 변수가 T 유형이지만 user.SayWat()가 수신자 유형 *T를 사용하여 메서드를 호출한다고 추론합니다. 이 동작은 컴파일러의 & 자동 삽입으로 인해 발생합니다. 주소 연산자. 본질적으로 (&user).SayWat()에 대한 호출을 다시 작성합니다.
포인터 유형에 대한 호출 방법
포인터 유형에 대한 메소드는 T 유형의 변수에서 호출되지만 이는 엄밀히 말하면 사실이 아닙니다. 컴파일러는 *T 유형의 수신자를 사용하며 &user를 T로 역참조하는 것은 암시적 작업입니다.
암시적 역참조 예외
그러나 이 암시적 역참조가 모든 경우에 적용되는 것은 아닙니다. 반환 값(주소 지정 불가능)에서 포인터 수신기를 사용하여 메서드를 호출하면 다음과 같은 컴파일 시간 오류가 발생합니다.
func aUser() User { return User{} } ... aUser().SayWat()
오류 메시지
cannot call pointer method on aUser() cannot take the address of aUser()
위 내용은 포인터 수신기 메서드를 호출할 때 Go가 암시적으로 역참조하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!