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

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

Mary-Kate Olsen
풀어 주다: 2024-12-30 13:00:18
원래의
976명이 탐색했습니다.

Why Can I Call Pointer Methods 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()
    fmt.Println("Wheels:", c.wheels)
}
로그인 후 복사

c.fourWheels() 표현식은 (&c)의 약어입니다. .네바퀴(). 이는 fourWheels의 수신자가 포인터이고 c가 포인터가 아닌 값이기 때문입니다. c는 주소 지정이 가능하므로 컴파일러는 자동으로 이를 역참조하여 car 값에 대한 포인터를 얻은 다음 수신자로 사용됩니다.

이 동작은 Go 사양에 명시적으로 설명되어 있습니다.

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

따라서 포인터 메서드에 대한 일반 규칙은 유효하지만 자동 포인터 역참조를 사용하면 특정 상황에서 포인터가 아닌 값에 대한 포인터 메서드를 편리하게 호출할 수 있습니다. 이 동작은 포인터 수신기가 있는 메서드에만 적용된다는 점에 유의하는 것이 중요합니다.

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

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