> 백엔드 개발 > Golang > 포인터 수신기 메서드를 호출할 때 Go가 암시적으로 역참조하는 이유는 무엇입니까?

포인터 수신기 메서드를 호출할 때 Go가 암시적으로 역참조하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-02 07:03:10
원래의
804명이 탐색했습니다.

Why Does Go Implicitly Dereference When Calling Pointer Receiver Methods?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿