> 백엔드 개발 > Golang > Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있는 이유는 무엇입니까?

Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-27 11:49:11
원래의
784명이 탐색했습니다.

Why Can Pointer Methods Be Called on Non-Pointer Values in Go?

포인터가 아닌 유형에 대한 포인터 메서드 설명

Go에서 규칙에 따르면 값 메서드는 포인터와 값 모두에서 호출될 수 있습니다. 포인터 메서드는 포인터로 제한됩니다. 그러나 이 규칙의 명백한 예외는 포인터가 아닌 값에서 포인터 메서드를 실행하는 기능입니다.

다음 코드 조각을 고려하세요.

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()
    // Here, a pointer method is invoked on a non-pointer value
    fmt.Println("Wheels:", c.wheels)
}
로그인 후 복사

코드는 포인터 메서드 fourWheels를 성공적으로 실행합니다. 포인터가 아닌 값에 대해 c. 이는 확립된 규칙과 모순되는 것처럼 보일 수 있습니다.

실제로 포인터가 아닌 값 c에 대해 fourWheels 메소드를 호출할 때 약식 표기법을 사용하고 있습니다. c.fourWheels() 표현식은 (&c).fourWheels()와 동일합니다.

Go 사양에 따르면 "x가 주소 지정 가능하고 &x의 메서드 세트에 m이 포함되어 있으면 x.m()은 ( &x).m()."

즉, Go는 포인터가 아닌 값 c를 암시적으로 역참조하여 포인터를 얻습니다. 이는 포인터 메서드의 수신자로 사용됩니다.

포인터 메서드에 대한 규칙을 명확히 하려면 다음과 같이 해석해야 합니다.

  • 값 메서드는 다음에서 호출될 수 있습니다. 값과 포인터 모두.
  • 포인터 메서드는 포인터에서 호출할 수 있으며 어떤 경우에는 포인터가 아닌 값에서 호출할 수 있지만 포인터가 아닌 값을 호출할 수 있는 경우에만 가능합니다. 포인터를 통해 간접적으로 액세스됩니다.

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

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