>백엔드 개발 >Golang >포인터 수신기가 있는 Go 메서드를 포인터가 아닌 변수에서 호출할 수 있나요?

포인터 수신기가 있는 Go 메서드를 포인터가 아닌 변수에서 호출할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-01 16:22:10633검색

Can Go Methods with Pointer Receivers Be Called on Non-Pointer Variables?

Go의 단순 유형에서 포인터 유형의 메소드를 호출할 수 있습니까?

에 메소드가 설정되어 있다고 Go 사양에 명시되어 있음에도 불구하고 T에는 T의 메서드가 포함되어 있습니다. T 수신기가 있는 메서드를 유형의 변수에서 호출할 수 있는지에 대한 혼란이 발생합니다. T.

메서드 호출

문제의 핵심은 메소드 호출이 포인터 수신자 유형 사용으로 제한되지 않는다는 것입니다. 컴파일러는 원하는 수신자 유형을 얻기 위해 값을 자동으로 역참조하여 메서드 호출을 교묘하게 처리합니다. 실제로 *T 수신자를 사용하는 메서드 호출은 (&user).m()에 대한 호출과 동일합니다. 여기서 &user는 변수의 주소를 검색합니다.

실제 데모

다음 코드 예제를 고려해보세요.

package main

import "fmt"

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.SayWat()
}

이 코드를 실행하면 메소드가 사용자가 포인터 유형이 아니더라도 성공적으로 실행됩니다. 이는 컴파일러가 사용자가 SayWat 메서드를 호출하도록 자동으로 역참조하기 때문입니다.

모호성 해결

메서드 반환을 처리할 때 명확한 차이가 나타납니다. 메서드가 값을 반환하는 경우 점 구문으로 직접 호출할 수 없는 주소 지정이 불가능한 결과를 생성합니다. 대신 "&" 구문을 명시적으로 사용하여 반환 값의 주소를 얻으세요.

위 내용은 포인터 수신기가 있는 Go 메서드를 포인터가 아닌 변수에서 호출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.